2011-02-04 3 views
0

я искал в сети для ответа на мою проблему без каких-либо удачи, так как она идет:mod_rewrite сила в нижнем регистре URLs

Я переделка мой mod_rewrite для целей SEO и я хочу, чтобы все URLs быть в нижнем регистре, для экземпляр:

http://BLAbla.com/ 

становится

http://bla.com/ 

В настоящее время моя .htaccess выглядит следующим образом:

RewriteEngine on 

RewriteMap lc int:tolower 
RewriteCond %{REQUEST_URI} [A-Z] 
RewriteRule (.*) ${lc:$1} [R=301,L] 

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

RewriteRule ([\w]*)/$ http://%{HTTP_HOST}/$1 [R=301,L] 

RewriteRule ^([^/]+)/([^/]?)$ index.php?worker=$1&params=$2 [L] 

, но когда я запустил http://localhost/site/, я получаю ошибку 500. Я знаю только базовый reg ex и очень ограниченный mod_rewrite, поэтому я не могу записать ошибку здесь. Если я удалю строку rewritemap, страница не даст никаких ошибок. Является rewritemap не поддерживается моим сервером или что-то ??

Любые другие комментарии относительно файла .htaccess очень приветствуются :)

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

ответ

5

@Esben

Переписывая имя хоста немного сложнее. У вас есть доступ к журналу ошибок сервера? Потому что может некоторое использование информации о причине 500.

Это хорошая идея, чтобы заключить параметры в кавычках только для ясности:

RewriteMap lc int:tolower 
RewriteCond "%{REQUEST_URI}" "[A-Z]" 
RewriteRule "(.*)"   "${lc:$1}" [R=301,L] 

[L] собирается заставить это закончить обработку этот запрос, что означает, что если в URI будет сделано больше работы, это произойдет, когда запрос будет повторно отправлен. Вы могли бы хотеть рассмотреть дозирование ваших изменений, чтобы запросы идут только через процесс munging раз:

RewriteMap lc int:tolower 
RewriteCond "%{REQUEST_URI}" "[A-Z]" 
RewriteRule "(.*)"   "${lc:$1}" [E=REDIRECT:TRUE] 

RewriteCond "%{HTTP_HOST}" "!^www\." [NC] 
RewriteRule "^"    "-"  [E=REDIRECT:TRUE,E=PREFIX_WWW:TRUE] 

Что следующее пытаемся сделать?

RewriteRule ([\w]*)/$ http://%{HTTP_HOST}/$1 [R=301,L] 

Эффект (несмотря на фанки регулярного выражения) является «Если REQUEST_URI заканчивается в» / ", лишить его и перенаправление. Это то, что вы хотите? Имейте в виду, что вещи немного отличаются в .htaccess файле ..

И это:

RewriteRule ^([^/]+)/([^/]?)$ index.php?worker=$1&params=$2 [L] 

Похоже, что вы пытаетесь сказать: «Изменение любого„Foo/бар“в«индекс. php? worker = foo & params = bar "'. Если это правильно, это, вероятно, не сработает. Поскольку вы находитесь в файле .htaccess, вы сопоставляетесь с пути файловой системы, не URI.

Так попробуйте это:

RewriteMap "lc"     "int:tolower" 

RewriteCond "%{REQUEST_URI}"  "[A-Z]" 
RewriteRule "(.*)"    "${lc:$1}" [E=REDIRECT:TRUE] 

RewriteCond "%{HTTP_HOST}"  "!^www\." [NC] 
RewriteRule "^"     "-"   [E=REDIRECT:TRUE,E=PREFIX_WWW:TRUE] 

RewriteCond "${ENV:REDIRECT}" "!TRUE" 
RewriteRule "^"     "-"  [SKIP=2] 
RewriteCond "${ENV:PREFIX_WWW}" "TRUE" 
RewriteRule "(.*)"    "http://www.${HTTP_HOST}/$1"  [R=301,L] 
RewriteRule "^"     "-"        [R=301,L] 

RewriteRule "^([^/]+)/([^/]?)$" "index.php?worker=$1&params=$2" [PT] 

Я не уверен, о влиянии SKIP на RewriteCond заявлений, смешанных с RewriteRule с, но дают выше попробовать и посмотреть, если вы ближе.

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