web-dev-qa-db-fra.com

Comment puis-je forcer la sortie de la page d'erreur 403-interdit par défaut lorsque http://example.com/not_found est demandé?

C’est ma première question sur StackExchange, alors laissez-moi vous présenter, voici un bref aperçu de ma configuration actuelle:

  • Deux domaines différents, deux TLD différents (. Dk et . De ) sur le même plan d'hébergement
  • pour des raisons de confidentialité, supposons que les noms de domaine soient "exemple de site Web" , c'est-à-dire https://www.example.dk et https://www.example.de
  • SSL mis en place sur les deux domaines
  • Basé sur WordPress, utilisant WPML pour diffuser le contenu traduit en conséquence

Le problème est que je reçois une quantité folle (de pays comme la Chine, l'Inde et le Pakistan) de /not_found à la fin de les deux noms de domaine 'URL, dans tous les formats possibles:

  • sécurisé, avec le protocole www (https://www.example....../not_found)
  • sécurisé, sans le protocole www (https://example....../not_found)
  • non sécurisé, avec le protocole www (http://www.example....../not_found)
  • non sécurisé, sans le protocole www (http://eksemp....../not_found)

Pour moi, ce modèle particulier semble n'être rien de plus que des tentatives d'analyse des vulnérabilités, surtout si l'on tient compte du fait que le contenu des sites est rédigé en danois ou en allemand. De plus, les sites Web s'adressent à un groupe cible danois ou allemand spécifique, ce qui rend très peu probable que les sites Web valent la peine d'être visités par les visiteurs de ces pays asiatiques. Actuellement, la réponse du serveur est la page 404 non trouvée fournie par le thème WordPress que nous utilisons, ce qui, à mon avis, n'est pas idéal, car je préférerais que l'accès à cette URL leur soit refusé, même si cela n'existe pas réellement.

Longue histoire abrégée, je me suis efforcé ces derniers jours de comprendre comment forcer le serveur Web à afficher la page 403-allowed au lieu de 404 car l’URL spécifiée n’existe pas sur le serveur.

J'ai créé un expression régulière que je souhaite utiliser dans le fichier .htaccess en tant que modèle couvrant tous les scénarios mentionnés ci-dessus (4 pour chaque nom de domaine). La partie de code que j'ai placée dans .htaccess va comme suit

# BEGIN /not_found blocking
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^(https{0,1}:\/\/)(www\.){0,1}(example\.dk|example\.de){1}(\/not_found){1}$
RewriteRule . - [R=403,NC]
</IfModule>
# END /not_found blocking

mais hélas cela ne fonctionne pas, car je reçois toujours la page d'erreur 404-not found au lieu de 403 Access Forbidden. Ce doit être de ma faute, mais quelle est la raison?

Toute aide serait grandement appréciée. Merci beaucoup!

4
GeekRider
RewriteCond %{REQUEST_URI} ^(https{0,1}:\/\/)(www\.){0,1}(eksempelhjemmeside\.dk|eksempelhjemmeside\.de){1}(\/not_found){1}$
RewriteRule . - [R=403,NC]

Vous semblez être trop compliquer les choses ici. La variable de serveur REQUEST_URI contient uniquement le chemin d’URL, c.-à-d. /not-found. Et c'est tout ce qui semble vous préoccuper. Vous n'avez pas besoin de vérifier le domaine, www/non-www, HTTP/HTTPS, car vous semblez vouloir faire correspondre toutes les variantes. Sauf s'il y a d'autres sous-domaines, etc. que vous ne voulez pas capturer? (Mais dans ce cas, il pourrait être plus simple de faire correspondre les exceptions, plutôt que la cible?)

Toutefois, comme @closetnoc l'a suggéré dans les commentaires, je retournerais quand même un simple "404 Introuvables" pour ces demandes - car c'est bien ce qu'elles sont. Par "simple", j'entends le défaut Apache 404, donc vous échouez tôt, plutôt que de transmettre la demande via WordPress, ce qui se passe actuellement. Donc, tout ce dont vous avez besoin est quelque chose comme ceci avant le WordPress _ contrôleur-avant:

# BLOCK /not_found
RewriteRule ^not_found$ - [R=404]

Pas besoin de l'encapsuleur <IfModule>, de la directive RewriteEngine (car celle-ci est déjà incluse dans le bloc WP) ou de la directive RewriteCond. Lorsque vous spécifiez un code d'état autre que 3xx, vous n'avez plus besoin de l'indicateur L (last) (c'est implicite).

Vous voudrez peut-être inclure l'indicateur NC (nocase), si vous recevez des demandes de /NoT_FounD et/ou /NOT_FOUND etc., mais cela devrait être omis dans le cas contraire.

Notez que dans .htaccess, le chemin d'URL correspondant à la RewriteRulemotif, n'inclut pas le préfixe de barre oblique. Ainsi, le motif^not_found$ ne correspond qu'à l'URL /not_found.

En tant qu'exercice académique, si vous souhaitez renvoyer un "403 interdit" au lieu d'un 404, vous modifierez la directive ci-dessus comme suit:

RewriteRule ^not_found$ - [F]

Encore une fois, pas besoin de l'indicateur L lorsque vous utilisez l'indicateur F. Vous pouvez également écrire R=403 à la place, mais F est le raccourci préféré.

1
MrWhite

J'utilise ce code htaccess pour supprimer certains mots des URL et les rediriger vers la page d'accueil. Je l'ai modifié pour votre situation. Je n'ai pas testé cette version mais je pense que ça devrait marcher. Je ne sais pas s'il faut faire quelque chose de plus pour le trait de soulignement ou non.

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)not_found(.*)$ $1$2  [R=301,L]

Vous pouvez simplement créer la page/not_found et en php définir l'état de l'en-tête sur 403

header('HTTP/1.0 403 Forbidden');

echo 'You are forbidden!';
0
Michael d