2009-08-23 2 views
0

Я хочу просто не использовать амперсанд в моем URL-адресе, чтобы я мог передавать амперсанды дальше в мою систему, когда файл запрашивается. Проблема заключается в том, что Apache имеет дело с этим по-разному. Я не знаю, какmod_rewrite заменить все экземпляры амперсанда на% 26 для более поздних версий

Я уже переписал запрошенный файл index.php? Url = $ 1, чтобы я мог видеть, что это было, но если у него есть амперсанд, он не может продолжить его!

Как я могу избежать амперсанда или превратить его в шестую равную (% 26)?

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

ответ

1

Добавить

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

К вашим правилам перезаписи.

+0

hmm, это, кажется, нарушает условие! -f сверху и теперь все внешние файлы не работают на сервере – Supernovah

+0

Где вы поместили строку RewriteRule? –

0

Попробуйте поместить это правило над вашими:

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

В дополнение, если вы хотите, чтобы отправить обратно в браузер редирект с амперсанд в URL вы можете добавить [NE] флаг к концу RewriteRule.

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

первый убедитесь, что URL, вы строите избежали & символа на% 26, так что это не амперсанд, когда он попадает на сервер. то в правиле переписывания добавить B тега, поэтому он не будет преобразовать его обратно в &:

RewriteRule^(. *) $ index.php URL = $ 1 [B, QSA, L]

Этот тег B сохранил мой прикладок через 2 дня, пытаясь переписать правила перезаписи.

0

Правильный способ избежать амперсанд в строке запроса, модифицированного mod_rewrite является

%2526 

, если он обрабатывается с помощью PHP.

Когда apache перезаписывает его, он превращается из %2526 в %26, который затем преобразует в & и сохраняет в переменной запроса.

Использование правила rewrite B также работает, но тогда все плюсовые знаки в параметре остаются плюс знаками в php.

Реальный пример мира, который мне пришлось столкнуться:

/group/Simon+%26+Garfunkel 

С B он переписывает в

group.php?group=Simon+%26+Garfunkel 

и в PHP вы получаете

$group="Simon+&+Garfunkel"; 

когда вы хотели

$group="Simon & Garfunkel" 

С B вам нужно

/group/Simon%20%26%20Garfunkel 

, который работает отлично.

без B вы получите

group.php?group=Simon%20&%20Garfunkel 

и вы в конечном итоге с

$group="Simon "; 

потому что & разделяет строки запроса.

Но если вы дважды бежать

/group/Simon+%2526+Garfunkel 

он переписывает в

group.php?group=Simon%20%26%20Garfunkel 

и вы в конечном итоге с

$group="Simon & Garfunkel"; 

, как ожидалось.

Если URL-адрес НЕ обрабатывается mod_rewrite в «чистый URL-адрес», мы можем использовать %26 просто отлично.