Переписать правило, чтобы предотвратить декодирование apache до достижения htaccess? - PullRequest
0 голосов
/ 19 октября 2018

У нас есть правило htaccess, подобное этому:

RewriteRule ^(.*)/(.*)/(.*) ../app$1/scripts/api/index.php?fn=$2&$3 [L]

В большинстве случаев это работает нормально, однако Apache декодирует URL-адрес до того, как он достигнет этого правила, поэтому URL, такой как beta/list/&cat=red%20%26%20blue, виденhtaccess как beta/list/&cat=red & blue, поэтому мы получаем cat='red' и blue=null, входящие в index.php вместо cat='red & blue'.

Я читал, что обходной путь для этой проблемы заключается в использовании серверных переменных, таких как %{REQUEST_URI} %{THE_REQUEST} в правиле htaccess, поскольку они не декодируются перед использованием, но их трудно реализовать.Знак вопроса в RewriteRule сводит все с ума, и я не могу понять, как избежать этого.

Могут ли какие-либо эксперты помочь мне исправить приведенное ниже правило, чтобы оно велось так же, как и выше?

RewriteCond %{REQUEST_URI} ^(.*)/(.*)/(.*)
RewriteRule . ../app%1/scripts/api/index.php?fn=%2&%3 [L]

1 Ответ

0 голосов
/ 22 октября 2018

Действительно, решение состоит в том, чтобы использовать специальную переменную сервера с именем THE_REQUEST.

Из документации mod_rewrite :

THE_REQUEST

Полная строка HTTP-запроса, отправленная браузером на сервер (например, «GET /index.html HTTP / 1.1»).Это не включает никаких дополнительных заголовков, отправленных браузером. Это значение не было сохранено (декодировано) , в отличие от большинства других переменных, приведенных ниже.

Вот как должно выглядеть ваше правило

# don't touch urls ending by index.php
RewriteRule index\.php$ - [L]

# user request matching /xxx/xxx/xxx (with optional query string)
RewriteCond %{THE_REQUEST} \s/([^/\?]+)/([^/\?]+)/([^\?]+)(?:\s|\?) [NC]
RewriteRule ^ ../app%1/scripts/api/index.php?fn=%2&%3 [L,QSA]

Обратите вниманиечто вы не должны использовать относительный путь для внутренней перезаписи, что может привести к путанице.Вместо этого определите RewriteBase, используйте абсолютный путь или начните с корня домена с /.

ОБНОВЛЕНИЕ

Поскольку вы можете закодировать прямые косые черты в своем URL, вам нужноустановить AllowEncodedSlashes на NoDecode (или On, но это небезопасно).Также обратите внимание, что из-за ошибки вы должны поместить эту директиву в контекст виртуального хоста, даже если говорят, что контекст server config в порядке (в противном случае он просто игнорируется).).По умолчанию AllowEncodedSlashes установлено на Off.Таким образом, Apache самостоятельно обрабатывает закодированные косые черты и отклоняет их, не передавая запрос на mod_rewrite.Смотри официальную документацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...