mod_rewrite remplacer toutes les occurrences de esperluette avec 26% pour plus tard
-
19-09-2019 - |
Question
Je veux tout simplement pas utiliser esperluette dans mon URL, je peux passer esperluette plus bas dans mon système lorsqu'un fichier est demandé. Le problème est traite Apache avec différemment. Je ne sais pas comment
Je l'ai déjà réécris le fichier demandé à index.php? Url = 1 $ pour que je puisse voir ce qu'il était, mais si elle a une esperluette là-dedans, il ne peut pas continuer au-delà, il!
comment puis-je l'esperluette ou la transformer en elle l'égale hexagonale (% 26)?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>`
La solution
La bonne façon d'échapper esperluette dans une chaîne de requête modifiée par mod_rewrite
est
%2526
si elle est en cours de traitement par php.
Lorsqu'Apache réécrit, il est tourné de %2526
à %26
qui php convertit ensuite en &
et stocke dans la variable de requête.
En utilisant la règle de réécriture de B
fonctionne aussi, mais tous les signes plus dans le paramètre restent des signes plus en php.
Le exemple du monde réel que je devais faire face:
/group/Simon+%26+Garfunkel
Avec B
Récrit à
group.php?group=Simon+%26+Garfunkel
et en php vous obtenez
$group="Simon+&+Garfunkel";
quand vous vouliez
$group="Simon & Garfunkel"
B dont vous avez besoin
/group/Simon%20%26%20Garfunkel
qui fonctionne très bien.
sans B
vous obtenez
group.php?group=Simon%20&%20Garfunkel
et vous vous retrouvez avec
$group="Simon ";
parce que la &
divise les chaînes de requête.
Mais si vous double évasion
/group/Simon+%2526+Garfunkel
Récrit à
group.php?group=Simon%20%26%20Garfunkel
et vous vous retrouvez avec
$group="Simon & Garfunkel";
comme prévu.
Si l'URL n'analysé par mod_rewrite
dans une « URL propre », alors nous pouvons utiliser %26
très bien.
Autres conseils
1er assurez-vous de l'url construisiez ont échappé et symbole% 26 il est donc pas une esperluette quand il arrive à votre serveur. puis dans la règle de réécriture ajouter la balise B de sorte qu'il ne sera pas le reconvertir au &:
RewriteRule ^ (. *) Index.php $? Url = $ 1 [B, QSA, L]
Cette balise B a sauvé mes fesses au bout de 2 jours d'essayer différentes règles de réécriture.
Ajouter
RewriteRule ^(.*)\&(.*)$ $1\%26$2
Pour vos règles de réécriture.
Essayez de mettre cette règle ci-dessus vôtre:
RewriteRule ^([^&]*)&(.*) $1\%26$2 [N]
En outre, si vous voulez envoyer au navigateur une redirection avec l'esperluette dans l'URL, vous pouvez ajouter le [NE] drapeau à la fin de la RewriteRule.
RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L]