1 votes

apache - la règle de réécriture de la chaîne de requête ajoute une condition à l'URL

En essayant de réécrire

site-search.html?searchword=search%20term 

comme

advanced-search#q=search%20term

Je finis toujours par advanced-search#q=%3Fsearchword%3search%20term

Le site %3Fsearchword%3 est mystérieusement ajoutée à l'URL générée juste avant le terme de recherche.

La règle que j'ai mise en place est la suivante :

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=(.*)$
RewriteRule ^(.*)$ http://www.example.com/advanced-search#q=%1 [R=301,L,NE]

Il convient de mentionner que ce que je mets après "q=" ne fait aucune différence. La même erreur ou une légère variation de to se produira quoi qu'il en soit.

1voto

asdmin Points 1990

Le %1 de RewriteRule provient de la même condition (.*) de RewriteRule, et vous faites correspondre la chaîne de requête avec l'URI lui-même.

Solution 1 : Déplacez ou copiez votre modèle dans le deuxième RewriteCond dans la condition de la RewriteRule.

Sur la base des commentaires, et d'une hypothèse, que voudriez-vous atteindre, un peu comme ceci :

RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$
RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteRule [?&]searchword=([^&]*) http://www.domain.com/advanced-search#q=%1 [R=301,L,NE]

Solution 2 : explorez le drapeau [QSA] de RewriteRule, qui ajoute la chaîne de requête entière à l'uri résultante pour vous. (pas pour Apache 2.2)

1 votes

L'indicateur QSA n'est pas supporté sous Apache 2.2, la version que j'utilise.

0 votes

En ce qui concerne la solution 1, RewriteRule ^searchword=(.*) domaine.com/recherche avancée#q=$1 [R=301,L,NE], cela conduit à une erreur 404.

0 votes

@manchine oui, désolé. je vais le laisser pour la référence. avez-vous besoin d'aide avec le premier ?

0voto

manchine Points 41

Après avoir modifié la patte de correspondance et ajouté un ? à l'URL cible, la syntaxe fonctionne enfin comme prévu.

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=([^&]+)
RewriteRule ^([^&]+) http://www.domain.com/advanced-search?#q=%1 [R=301,L,NE]

Le ? dans l'URL cible empêche la chaîne de requête originale d'être reformulée. Si vous utilisez Apache 2.4, le même résultat peut être obtenu en passant l'indicateur QSD à la règle rewire.

De même, si l'URL cible contient un # (identifiant de fragment), veillez à le faire précéder de ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X