конфликт переписывания apache - PullRequest
0 голосов
/ 27 августа 2010

Я знаю, что что-то противоречиво, но, переписав мод, Muggle пришло время обратиться за помощью.

Я переписываю http://test.com/[name]/
до http://test.com/script.php?id=[name]
с успехом, используя:

(rule#1)
RewriteRule ^(.*)\/$ script.php?id=$1&%{QUERY_STRING} [L]

Далее я переписываю http://test.com/[name]/foobar/[key]
до http://test.com/script.php?id=[name]&foobar=[key]
также с успехом, используя:

(rule#2)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]

Однако, когда я пытаюсь включить строки запроса,
так что http://test.com/[name]/foobar/[key]?p=[page]
можно переписать на http://test.com/script.php?id=[name]&foobar=[key]&p=[page]
с этим:

(rule#3)
RewriteRule ^(.*)\/foobar/([0-9]+)$ script.php?id=$1&foobar=$2&%{QUERY_STRING} [L]

тогда Apache просто возвращает меня к http://test.com/script.php.

Из проб и ошибок я знаю, что правило № 3 сработало бы, если бы оно не использовало тот же скрипт script.php, что и правило № 1,
но я понятия не имею, как это исправить, поэтому любая помощь приветствуется!

Arrgh..после двойной проверки моих правил с примерами Гамбо, я наконец узнал, что пошло не так. Хотя мои правила перезаписи не были идеальными, они работали, как задумано. Однако я полностью забыл, что у меня был другой скрипт, который проверяет допустимые параметры ... очевидно, выбрасывая случайные значения теста, иногда это не очень хорошая идея. Спасибо за ^ / трюк, хотя!

Ответы [ 2 ]

2 голосов
/ 27 августа 2010

Используйте [^/]+ для сопоставления только одного или нескольких произвольных символов, кроме / вместо .* любого количества произвольных символов:

RewriteRule ^([^/]+)/$ script.php?id=$1&%{QUERY_STRING} [L]
RewriteRule ^([^/]+)/foobar/([0-9]+)$ script.php?id=$1&foobar=$2 [L]

Кроме того, вы можете установить флаг QSA , чтобы исходный запрашиваемый запрос автоматически добавлялся к новому URL-адресу вместо добавления его вручную:

RewriteRule ^([^/]+)/$ script.php?id=$1 [L,QSA]
0 голосов
/ 27 августа 2010

Предупреждение: вы используете .*, который на самом деле ничего не может найти.Используйте .+, если только вы не намерены ничего не соответствовать.

Все ли ваши правила перечислены здесь?Есть ли ошибки в вашем error_log по этому поводу?

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