многоязычный сайт htaccess с подкаталогами и по умолчанию 301
у меня возникли некоторые проблемы с настройкой моего htaccess, чтобы позволить нескольким языкам использовать метод подкаталога, например:
http://www.domain.com/en/
http://www.domain.com/sw/
http://www.domain.com/ie/
также, чтобы усложнить ситуацию, проект в настоящее время не живет, его на dev-сервере. Например, в настоящее время я получаю доступ к проекту по адресу:
http://dev.domain.com/devname/projectname/
и я хочу, чтобы автоматически 301 перенаправление на:
http://dev.domain.com/devname/projectname/en/
вот мой реврайт:
Options +FollowSymLinks -MultiViews
RewriteEngine on
# ----------------------------------------------------------------------
# MULTI LANGUAGE SUB DIRECTORY
# ----------------------------------------------------------------------
RewriteCond %{REQUEST_URI} !^/(en|sw)/
RewriteRule ^(.*)$ en/ [R=301,L]
# ----------------------------------------------------------------------
# Rewrite rules
# ----------------------------------------------------------------------
## CASE STUDIES ##
RewriteRule ^casestudies/([^/.]+).html$ index.php?controller=contents&method=viewCasestudy&link= [L,QSA]
## PRODUCTS ##
RewriteRule ^products/([^/.]+).html$ index.php?controller=contents&method=viewProduct&link= [L,QSA]
RewriteRule ^([a-z{2}]+)(/)?$ index.php?controller=contents&method=viewHome&lang= [L,QSA] # Default load
RewriteRule ^(/)?$ index.php?controller=contents&method=viewHome [L,QSA] # Default load
вышеуказанное фактически перенаправит на:
http://dev.domain.com/home/webserver_dir/devname/projectname/en/
..и если я использую RewriteBase, это кажется просто goto...
http://dev.domain.com/en/
мой вопрос: как я могу заставить URL-адреса языка работать правильно относительно каталога его на моем dev-сервере, а затем идеально будет работать, когда он будет жить без каких-либо правил среды.
бонус-вопрос: мне нужно добавить ([a-z{2}]+) бит перед всеми моими последующими правилами перезаписи или я могу поймать все, что повлияет на все дальнейшие правила?
изменить -----------------------------
я сократил его до следующего, как было предложено...
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase /devname/projectname/
RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/ [R=301,L]
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang= [NC,L,QSA] # Default load
... но теперь его перенаправление на http://dev.domain.com/devname/projectname/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/
, есть идеи?
2 ответов
вы пробовали ответ по следующей ссылке? Он должен делать то, чего вы пытаетесь достичь.
бесконечный цикл перенаправления по правилам htaccess multi language
RewriteEngine On
RewriteBase /
# empty url -> redirect to en/
RewriteCond %{QUERY_STRING} !lang=(en|de)
RewriteRule ^$ en/ [R=301,L]
# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteRule ^(en|de)$ / [R=301,L]
# now all urls have en/ de/ -> parse them
RewriteRule ^(en|de)/(.*)$ ?lang=&%{query_STRING} [L]
если .htaccess не должен меняться
изменить <VirtualHost>
настройки DEV сервер
<VirtualHost *:80>
ServerName dev.domain.com
ServerAlias project.domain.com
DocumentRoot "/home/webserver_dir/devname/projectname"
</VirtualHost>
эти изменения, как правило, идут в вашем httpd-vhosts.conf. Ваш .реврайт файлы теперь будут иметь
RewriteBase /
Марк root в своем базовый для развитие и live сервера.
если вы пытаетесь версировать свои проекты или тестировать несколько проектов на одном и том же dev host, тогда вам придется включить схему именования в доменные имена вместо URL-адреса. Например,
<VirtualHost *:80>
ServerName dev1.domain.com
ServerAlias project1.domain.com
DocumentRoot "/home/webserver_dir/dev1/project1"
</VirtualHost>
<VirtualHost *:80>
ServerName dev2.domain.com
ServerAlias project2.domain.com
DocumentRoot "/home/webserver_dir/dev2/project2"
</VirtualHost>
суть в том, что вы не можете иметь тот же .реврайт файловые правила, работающие нетронутыми с различными каталогами развертывания, если вы не прибегаете к mod-переписать способ если-нибудь mumbo jumbo, который будет просто добавлен беспорядок, как только вы уйдете в прямом эфире.
чтобы правила работали прозрачно, Apache должен только видеть и применять правила о том, что происходит live (содержание, которое приходит после /devX/projectX/
каталоги), что перекладывание DocumentRoot
здесь для нас.
если минимальные моды .htaccess в порядке
не у всех есть доступ к Apache .conf файлы. Некоторые хосты out-справедливо отклонять запросы на их изменение. Вот почему, если они хотя бы сохранили mod-переписать включено, многие настройки веб-сайта могут быть обработаны. Один из них-использовать RewriteBase
для обработки различных каталогов развертывания.
Итак, если вы держите RewriteBase /
on live но измените его на RewriteBase /devX/projectX/
на развитие большинство ваших RewriteRule
s должен работать как есть. Итак,/devname/projectname/
следует правильно перенаправить на /devname/projectname/en/
.
Использование
([a-z{2}]+)
некорректно. Ты наверное имел ввиду ([a-z]{2})
чтобы захватить ровно две буквы. Если бы вы намеревались захватить два или более, это стало бы ([a-z]{2,})
. Итак, ваш загрузки по умолчанию переписать станет
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang= [NC,L,QSA] # Default load
вы правы, предполагая, что вам понадобится это регулярное выражение для всех последующих правил, или они не будут совпадать. Итак, ваш RewriteRule
на casestudies
не работает. Простой способ плевать на язык префикс уронить ^
начало привязки пути URL как
RewriteRule /casestudies/([^/\.]+).html$ index.php?controller=contents&method=viewCasestudy&link= [NC,L,QSA]
RewriteRule /products/([^/\.]+).html$ index.php?controller=contents&method=viewProduct&link= [NC,L,QSA]
последнего RewriteRule
соответствующего ^(/)?$
не требуется, потому что вы уже делаете 301
перенаправление для всех URL-адресов без префикса языкового каталога в /en/
выше, что в идеале должно быть
RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/ [R=301,L]
иначе /en
и перенаправляют /en/en
.