Проблема здесь в том, что флаг L вызывает перезапуск процесса перезаписи с переписанным URL ( Я уже говорил вам, что , не't I?):
Помните, однако, что если RewriteRule
генерирует внутреннее перенаправление (что часто происходит при перезаписи в контексте для каждого каталога), это приведет к повторному отклонению запроса и будетПовторите обработку, начиная с первого RewriteRule
.
Теперь, когда запрашивается /about
, первое правило get применяется и перенаправляется на /about/
.Затем обрабатывается последующий запрос /about/
, сначала применяется третье правило и путь URL переписывается на /page.php
.Пока все хорошо.
Но теперь происходит внутреннее перенаправление и процесс перезаписи перезапускается с новым URL-путем /page.php
.Затем это снова выбирается первым правилом и перенаправляется извне на /page.php/
.
Второе правило не должно применяться вообще, поскольку шаблон ^/
никогда не должен совпадать как для каждого каталогаПрефикс пути удаляется перед тестированием шаблона при использовании mod_rewrite в файле .htaccess :
При использовании механизма перезаписи в файлах .htaccess префикс для каждого каталога (который всегда одинаков дляопределенная директория) автоматически удаляется для сопоставления с шаблоном и автоматически добавляется после выполнения подстановки.
Но эти правила должны работать:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ /$0/ [L,R=301]
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteCond $0/%1 !^([^/]+)/\1$
RewriteRule ^[^/]* /%1%{REQUEST_URI} [L]
RewriteCond %{HTTP_HOST} !=www.example.com [NC]
RewriteCond $1 !.*\.(php|css|js|png|jpg|gif|htm|html)$
RewriteRule .* page.php?q=$0 [L]