Использование mod_rewrite в .htaccess как в корне сайта, так и в подкаталоге

Моя дилемма:

В .htaccess в корне моего сайта:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

В .htaccess в подкаталоге /foo

RewriteEngine On
RewriteRule ^page1\.html$ /foo/page2.html [R=301]

Во-первых, я стараюсь, чтобы все запросы включали начало www. Во втором я перенаправляю запросы для page1.html в подкаталоге foo на page2.html, также в этом подкаталоге.

В моем браузере, пытаясь посетить:

http://www.example.com/foo/page2.html ‹== работает, хорошо

http://www.example.com/foo/page1.html ‹== перенаправляет на http://www.example.com/foo/page2.html, хорошо

http://example.com/foo/page1.html ‹== перенаправляет на http://www.example.com/foo/page2.html, хорошо

http://example.com/foo/page2.html ‹== нет происходит перенаправление, плохо

==> Следует перенаправить на: http://**www.**example.com/foo/page2.html

В ходе экспериментов оказалось, что правила перенаправления в файле .htaccess в корне веб-сайта действуют только для запросов к страницам в этом подкаталоге, ЕСЛИ в этом подкаталоге нет файла .htaccess или он есть и указывает правило перезаписи, которое действует для этого конкретного запроса.

Может ли кто-нибудь увидеть, что я делаю неправильно? Как я могу получить правило перезаписи, которое прикрепляет www. in, если он отсутствует для активации для http://example.com/foo/page2.html ?


Спасибо, Хоп, сработало!

Для записи мне пришлось изменить правило перезаписи в файле в корне сайта на:

RewriteRule ^.*$ http://www.example.com%{REQUEST_URI} [R=301,L]

Что просто отлично. Спасибо!


person Matt Blaine    schedule 03.12.2008    source источник
comment
на самом деле вы можете написать второе правило как 'RewriteRule ^page1\.html$ page2.html [R=301]'; см. документацию для RewriteBase   -  person    schedule 04.12.2008


Ответы (2)


Вам не хватает следующей директивы в foo/.htaccess:

RewriteOptions inherit

ср. документация

person Community    schedule 04.12.2008

я не уверен в деталях, почему правила в /.htaccess не применяются к /foo/.htaccess. как правило, файлы .htaccess наследуют правила вверх по структуре каталогов, что может привести к разного рода странным вещам. однако для вашего конкретного решения вы можете просто поместить все соответствующие правила в свой родительский файл .htaccess как таковой:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteRule ^foo/page1\.html$ /foo/page2.html [R=301]
person Owen    schedule 03.12.2008