web-dev-qa-db-fra.com

Rediriger les URL avec un # dans .htaccess

J'obtiens 404 sur l'un de mes sites, car certains scripts récupèrent toutes les URL de la page de démarrage sous la forme d'URL brutes, de sorte qu'elles incluent le # dans l'URL. Les navigateurs normaux n'envoient jamais cette partie au serveur, mais ces scripts le font.

Voici à quoi ressemble une URL de requête typique:

/2014/how-to-manage-wordpress-multisite-imports-with-wp-cli/#comments

Le # n'est pas une URL encodée.

J'ai essayé les deux méthodes suivantes:

RedirectMatch 301 \#comments       /

et

RewriteRule #(.+)$ /? [L,R=301]

Sans succès, les règles ne capturent pas ces requêtes, car le # commence un commentaire. Les champs référent et agent utilisateur sont vides.

Que devrais-je faire?

5
fuxia

Depuis la documentation de mod_rewrite vous devez utiliser le drapeau NE (pas d'échappement) lorsque votre règle de réécriture a un hachage:

RewriteRule #(.+)$ /? [L,R=301,NE]

Vous avez indiqué que l'indicateur NE ne peut s'appliquer qu'à l'URL cible et non au modèle de réécriture. Si tel est le cas, une autre approche consisterait à échapper au signe #. mod_rewrite supporte \x séquences d'échappement de style . La séquence d'échappement pour # serait \x23. Donc, votre règle de réécriture pourrait être:

RewriteRule \x23.+$ / [L,R=301]

Si vous souhaitez tester une solution, vous pouvez le faire avec telnet sur la ligne de commande. Utilisez la ligne de commande telnet example.com 80 pour ouvrir un socket sur votre serveur Web. Puis faites une demande simple comme ceci:

GET /#test HTTP/1.0
Host: example.com

Suivi d'une nouvelle ligne supplémentaire.

4
Stephen Ostermiller