2009-08-23 4 views
0

Je ne veux tout simplement pas utiliser l'esperluette dans mon URL afin de pouvoir passer des esperluettes plus bas dans mon système lorsqu'un fichier est demandé. Le problème est Apache traite différemment. Je ne sais pas commentmod_rewrite remplacer toutes les instances de l'esperluette par% 26 pour plus tard

Je réécris déjà le fichier demandé à index.php? Url = $ 1 pour que je puisse voir ce que c'était, mais s'il a une esperluette dedans, il ne peut pas continuer au-delà! Comment puis-je échapper l'esperluette ou la mettre dans son hexagone (% 26)?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule>` 

Répondre

1

Ajouter

RewriteRule ^(.*)\&(.*)$ $1\%26$2 

Pour vos règles de réécriture.

+0

hmm, cela semble casser la condition! -f par dessus et maintenant tous les fichiers externes ne fonctionnent pas sur le serveur – Supernovah

+0

Où avez-vous mis la ligne RewriteRule? –

0

Essayez de mettre cette règle ci-dessus vôtre:

RewriteRule ^([^&]*)&(.*) $1\%26$2 [N] 
0

En outre, si vous voulez envoyer au navigateur une redirection avec l'esperluette dans l'URL, vous pouvez ajouter le drapeau [NE] à la fin de la RewriteRule.

RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L] 
4

1er assurez-vous de l'url construisiez ont échappé le 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 étiquette B a sauvé mes fesses après 2 jours d'essayer différentes règles de réécriture.

0

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. Lorsque Apache le réécrit, il est passé de %2526 à %26, puis il est converti en & et stocké dans la variable de requête. L'utilisation de la règle de réécriture B fonctionne également, mais tous les signes plus du paramètre restent des signes plus dans 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"; 

lorsque vous vouliez

$group="Simon & Garfunkel" 

Avec 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 le & 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'est PAS analysée par mod_rewrite dans une "URL propre", alors nous pouvons utiliser %26 très bien.

Questions connexes