Как URL-адрес изменяется более чем одним правилом перезаписи в htaccess? - PullRequest
4 голосов
/ 28 мая 2011

Я хотел бы задать вопрос, чтобы понять, как процессы Apache переписывают правила, указанные в файле .htaccess.

На моем сайте я использовал классическую организацию страниц по категориям, каждая категория имела большечем один раздел:

http://www.mysite.com/category/section.html.

Однако нет html-страниц, все обрабатывается кодом в pages.php.Используя простое правило перезаписи, URL-адреса, подобные приведенному выше, отображаются на:

http://www.mysite.com/pages.php?cat=category&page=section

Я решил переименовать раздел с section1 на section1-xxx .Чтобы обслуживать запросы на старое имя (section1), я добавил простое правило для сопоставления section1.html на section1-xxx.html .

ПервоеПравила, которые я добавил в .htaccess, были следующими:

R1

RewriteRule ^CAT1/section1.html$ CAT1/section1-xxx.html [NC]

, где CAT1 - название категории.

R2

RewriteRule ^CAT1/(.*).html$ pages.php?cat=CAT1&page=$1 [L,NC]

Моя идея заключалась в том, чтобы применить R1, а затем R2.Однако, когда эти правила применяются, я получаю необъяснимый (для моего мозга) URL.

Когда запрашивается следующая страница

http://www.mysite.com/CAT1/section1.html

, URL сначала преобразуется в

http://www.mysite.com/CAT1/section1-xxx.html/section1.html

затем в

http://www.mysite.com/pages.php?cat=CAT1&page=section1-xxx.html/section1

Из любопытства я добавил L (флаг) к правилу R1:

RewriteRule ^CAT1/section1.html$ CAT1/section1-xxx.html [L,NC]

и всеработал нормально.Теперь http://www.mysite.com/CAT1/section1.html обслуживается через:

http://www.mysite.com/pages.php?cat=CAT1&page=section1-xxx

Теперь вопросы:

  1. Почему я получил этот URL перед добавлением флага L Правило R1?
  2. Флаг L должен указывать на применение правила сопоставления, а затем прекратить использование других правил.Однако с установленным флагом L применяются значения R1 и R2 .Почему?

Спасибо за ваше время.

С уважением, A.

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Флаг [L] может привести к неожиданным результатам, если нам не ясно, как работает модуль. Обратите внимание, что следующее применимо, только когда mod_rewrite используется в файле .htaccess. Флаг [L] ведет себя точно так, как ожидается, когда используется в httpd.conf.

Флаг L скажет Apache прекратить обработку правил перезаписи для этого запроса. Теперь, что часто не реализуется, это то, что теперь он делает новый запрос на новое, переписанное имя файла и снова начинает обработку правил перезаписи.

Поэтому, если вы должны были сделать перезапись, где назначение все еще соответствует шаблону, оно не будет вести себя как нужно. В этих случаях вы должны использовать RewriteCond для исключения определенного файла из правила.

Как вы объяснили, добавьте L к R1. (R1 перенаправляет что-то .html на кого-то. Html, т.е. вы недоставляете html-страницу их!)

1 голос
/ 28 мая 2011

1) вам нужна начальная / строка замещения в R1

2) как сказал amolv, у вас есть две итерации через механизм перезаписи, в первом случае оба R1 и R2 совпадают, а переписанный URL не соответствует правилам во второй итерации; добавив L к R1, входящий URL совпал только с R1 на первой итерации и только с R2 на второй. С начальной / в R1 и R2 вам больше не нужен L в R1.

Я бы хотел знать содержимое этого раздела "XXX";)

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