2010-10-10 4 views
1

Я пытаюсь заставить привязку к моим 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/», которая является недействительной страницей ,

Как это сделать?

ответ

0

Проблема здесь состоит в том, что L flag вызывает перезапуск переписывания процесса с переписанной URL (I’ve already told you that, не так ли?):

Помните, однако, что если RewriteRule генерирует внутренний редирект (что часто возникает при переписывании в контексте для каждого каталога), это заново запросит запрос и вызовет повторение обработки, начиная с первого RewriteRule.

Теперь, когда /about запрашивается, то первое правило получить примененной и перенаправляет на /about/. Затем обрабатывается последующий запрос /about/, сначала применяется третье правило и URL-адрес переписывается в /page.php. Все идет нормально.

Но теперь происходит внутреннее перенаправление, и процесс перезаписи перезапускается с новым URL-адресом /page.php. Это снова извлекается первым правилом и перенаправляется извне в /page.php/.

Второе правило не должно применяться на всех, как шаблон ^/ никогда не должны совпадать как per-directory path prefix is removed before testing the pattern when using mod_rewrite in an .htaccess file:

При использовании двигателя переписывания в .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] 
+0

Я еще не очень профессионально относительно mod_rewrite, так что я очень благодарен за ваше время я учусь. Мой браузер говорит мне, что страница была направлена ​​неправильно - это то, что нуль в строке 6 действительно является нулем? – Ivar

+0

@ Иварска: Да, '$ 0' относится к согласованной строке всего шаблона. Но поскольку это не работает, вы должны выполнить некоторую отладку самостоятельно, используя функцию регистрации журнала mod_rewrite (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteloglevel). – Gumbo

+0

Хм, хорошо - почему я спросил, потому что вы написали 1 доллар, когда вы помогли мне в теме о субдоменах. Как ни странно, RewriteLogLevel 9 дает мне код ошибки 500 - также RewriteLogLevel 0. Я поставил это в первую строку, так что это странно. – Ivar

Смежные вопросы