многоязычный сайт 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/ на развитие большинство ваших RewriteRules должен работать как есть. Итак,/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.