Группа захвата Regex пуста, если я не использую флаг [QSA] - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю правило перезаписи, которое переписывает art/slug/... в art/.../?art=slug.Правило, которое я написал, работает, но выдает намеченную строку запроса только при использовании [QSA].

. Право над правилом - RewriteCond %{REQUEST_FILENAME} !-f, чтобы предотвратить зацикливание, если переписанный URL-адрес соответствует существующему файлу.

Я проверил следующие правила и перешел к art/test/, где $_GET соответствует var_dump 'd.Вот результаты:

RewriteRule ^art/([^/]*)/?(.*) art/$2?art=$1 [L] выходы 'art' => string ''
RewriteRule ^art/([^/]*)/?(.*) art/$2?art=$1 [QSA,L] выходы 'art' => string 'test'
RewriteRule ^art/([^/]*)/?(.*) art/$2?art=test [L] выходы 'art' => string 'test'

Насколько я понимаю, QSA предназначен для добавления «исходной» строки запроса к «переписанной».
В моей ситуации у меня нет ни одной строки запроса в исходном URL;это полностью сделано во время переписывания, поэтому в первом примере я не понимаю, почему мой ключ art установлен пустым (хотя он не является неопределенным).

Давайте предположим, что я неправильно понял QSAи что это требуется для того, чтобы вообще генерировать любую строку запроса;тогда как получается, что в третьем примере жесткое кодирование значения строки запроса работает без флага QSA?
Может ли удаление QSA как-то изменить способ работы моего регулярного выражения?


I 'работает на локальном сервере с WAMP 3.0.6 64bit, Apache 2.4.23 и PHP 7.0.10

1 Ответ

0 голосов
/ 18 февраля 2019

Я понимаю вашу проблему, вы должны предотвратить зацикливание, которое произошло во всех случаях, которые вы упомянули выше, поэтому перед перезаписью убедитесь, что нет query string, иначе зацикливание произойдет на всех из них и поэтому вы пропустили test в первой строке.

Добавьте это перед любым правилом и повторите тест:

RewriteCond %{QUERY_STRING} !^(.+)$
...