mod_rewrite заменяет все экземпляры амперсанда на% 26 для последующего - PullRequest
0 голосов
/ 23 августа 2009

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

Я уже переписал запрошенный файл в 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>`

Ответы [ 5 ]

4 голосов
/ 07 сентября 2012

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

RewriteRule ^ (. *) $ Index.php? Url = $ 1 [B, QSA, L]

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

1 голос
/ 26 августа 2017

Правильный способ экранирования от амперсанда в строке запроса, измененной mod_rewrite -

%2526

если он обрабатывается php.

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

Использование правила перезаписи 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 очень хорошо.

1 голос
/ 23 августа 2009

Добавить

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

К вашим правилам переписывания.

0 голосов
/ 23 мая 2010

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

RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L]
0 голосов
/ 23 августа 2009

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

RewriteRule ^([^&]*)&(.*) $1\%26$2 [N]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...