Принудительно завершающий слеш - PullRequest
1 голос
/ 10 октября 2010

Я пытаюсь использовать косую черту в своих URL, но не могу заставить ее работать так, как я хочу. Это мой файл .htaccess:

RewriteEngine on

#Force trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [L,R=301] 

#Subdomains
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} ^([^/.]+)\.example\.com$
RewriteCond $1/%1 !^([^/]+)/\1$
RewriteRule ^/([^/]+)? /%1%{REQUEST_URI} [L]

#Point everything to page.php
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond $1 !^(.*).(php|css|js|png|jpg|gif|htm|html)$
RewriteRule ^(.*)$ page.php?q=$1 [L,NC]

Если я перехожу на «en.example.com/about», меня перенаправляют на «en.example.com/en/about/», который является недействительной страницей.

Как я могу сделать эту работу?

1 Ответ

0 голосов
/ 11 октября 2010

Проблема здесь в том, что флаг 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]
...