web-dev-qa-db-fra.com

Possible de faire correspondre des caractères spéciaux avec mod_alias et la directive `Redirect`?

J’utilise Apache 2.4.6 avec mod_alias et j’ai un site Web qui reçoit du trafic à partir d’un lien situé sur un autre site Web sur lequel je n’ai aucun contrôle. Le lien de l’autre site est mal formé et les visiteurs qui viennent de mon site externe sur mon site reçoivent immédiatement une erreur 400. L'URL se termine par un signe littéral % pour une raison quelconque: domain.com/news/october_news.pdf%

(Note latérale: Il suffit de dire que le site Web d'origine ne peut pas être contacté et ne changera pas l'URL pour des raisons inconnues.)

Mon site utilise beaucoup mod_alias et la directive Redirect. J'espérais donc maintenir la cohérence et utiliser la même directive au profit des futurs webmasters. Il me semble possible de lire la documentation, mais j’ai été incapable de la faire fonctionner. Je tente de rediriger toute personne se rendant à l'URL domain.com/news/october_news.pdf% vers domain.com/news/october_news.pdf. Fondamentalement, je dois pirater le signe de pourcentage. Comment pourrais-je m'y prendre avec mod_alias et Redirect? Ou peut-être que cela ne peut simplement pas être fait et que je dois utiliser RedirectMatch.

J'ai actuellement essayé chacune des opérations suivantes dans un fichier .htaccess:

redirect “/news/october_news.pdf%” “/news/october_news.pdf”
redirect “/news/october_news.pdf%25” “/news/october_news.pdf”
redirect “/news/october_news.pdf\%” “/news/october_news.pdf”

Tous n'ont pas changé l'erreur 400 Bad Request renvoyée par Apache au navigateur.

3
Wesley

Vous ne pouvez pas utiliser un mod_alias Redirect (ni même mod_rewrite RewriteRule - qui exécute avant mod_alias) pour attraper 400 "requête incorrecte". Ceci s'applique aux directives à la fois dans .htaccess et dans la configuration du serveur. La "mauvaise demande" est simplement déclenchée beaucoup plus tôt dans la demande.

En fait, vous ne pouvez rien faire dans .htaccess pour intercepter la mauvaise demande. .htaccess n'est jamais traité - il est trop tard.

Toutefois, comme @Stephen l'a suggéré dans les commentaires, vous pouvez définir un document d'erreur 400 personnalisé dans le configuration du serveur et examiner ces demandes à l'aide de votre script côté serveur (par exemple, PHP) pour ensuite émettre une redirection surchargée. Mais ce document d'erreur doit doit être défini dans un contexte serveur ou virtualhost; .htaccess (ou <Directory> conteneurs) est trop tardif. Par exemple, directement dans votre conteneur <VirtualHost>:

ErrorDocument 400 /errordocs/e400.php

Ensuite, dans le cas de PHP, vous pouvez examiner l'URL demandée (contenant le % final) à l'aide des index REDIRECT_URL (ou REQUEST_URI) du $_SERVER superglobal. la redirection appropriée.

Assurez-vous que votre réponse 400 par défaut renvoie un message raisonnable/convivial avec les liens appropriés, sinon vous obtiendrez probablement un navigateur par défaut.


redirect “/news/october_news.pdf%” “/news/october_news.pdf”

De côté: Vous ne devriez pas utiliser de guillemets bouclés .. pour entourer les arguments - la requête ne correspondra jamais (pour cette raison également). Si vous avez besoin/voulez entourer les arguments, vous devez utiliser des guillemets droits droits, c'est-à-dire. ".

C’est aussi une redirection 302 (temporaire) (vous avez peut-être fait cela uniquement pour tester?). Cela devrait finalement être une redirection 301 (permanente).

1
MrWhite