mod_rewrite принудительно строчные URL - PullRequest
0 голосов
/ 04 февраля 2011

Я безуспешно искал в сети ответ на мою проблему, поэтому она говорит:

Я переделываю свой mod_rewrite для целей SEO и хочу, чтобы все URL-адреса были строчными, например:

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 очень приветствуются:)

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

1 Ответ

5 голосов
/ 04 февраля 2011

@ Esben

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

Рекомендуется заключать параметры в кавычки просто для ясности:

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

[L] заставит это завершить обработку этого запроса, а это означает, что если с 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]

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

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

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

А это:

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

Похоже, вы пытаетесь сказать "Измените" foo / bar "на" index.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 s, но попробуйте вышеописанное и посмотрите, подходите ли вы ближе.

...