htaccess具有子目录的多语言站点,默认为301

Hor*_*rse 13 .htaccess multilingual localization http-status-code-301

我在设置htaccess时遇到一些问题,允许使用子目录方法的多种语言,例如:

http://www.domain.com/en/
http://www.domain.com/sw/
http://www.domain.com/ie/
Run Code Online (Sandbox Code Playgroud)

另外,为了使事情复杂化,该项目目前还没有,它在开发服务器上.例如,我目前正在访问该项目:

http://dev.domain.com/devname/projectname/
Run Code Online (Sandbox Code Playgroud)

我希望以上内容自动301重定向到:

http://dev.domain.com/devname/projectname/en/
Run Code Online (Sandbox Code Playgroud)

这是我的htaccess:

Options +FollowSymLinks -MultiViews
RewriteEngine on

# ----------------------------------------------------------------------
# MULTI LANGUAGE SUB DIRECTORY
# ----------------------------------------------------------------------

RewriteCond %{REQUEST_URI} !^/(en|sw)/
RewriteRule ^(.*)$ en/$1 [R=301,L]

# ----------------------------------------------------------------------
# Rewrite rules
# ----------------------------------------------------------------------

## CASE STUDIES ##
RewriteRule ^casestudies/([^/\.]+).html$ index.php?controller=contents&method=viewCasestudy&link=$1 [L,QSA]

## PRODUCTS ##
RewriteRule ^products/([^/\.]+).html$ index.php?controller=contents&method=viewProduct&link=$1 [L,QSA]

RewriteRule ^([a-z{2}]+)(/)?$ index.php?controller=contents&method=viewHome&lang=$1 [L,QSA] # Default load
RewriteRule ^(/)?$ index.php?controller=contents&method=viewHome [L,QSA] # Default load
Run Code Online (Sandbox Code Playgroud)

以上将实际重定向到:

http://dev.domain.com/home/webserver_dir/devname/projectname/en/
Run Code Online (Sandbox Code Playgroud)

..如果我使用RewriteBase它似乎只是转到......

http://dev.domain.com/en/
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何使语言URL相对于其在我的开发服务器上的目录正常工作,然后理想情况下,它将在没有任何特定于环境的规则的情况下生效.

奖金问题:我是否需要在所有后续重写规则之前添加([az {2}] +)位,或者我是否可以捕获所有会影响所有其他规则的内容?

编辑-----------------------------

我建议把它减少到以下......

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteBase /devname/projectname/

RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/$1 [R=301,L]
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang=$1 [NC,L,QSA] # Default load
Run Code Online (Sandbox Code Playgroud)

...但现在它重定向到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/任何想法?

mel*_*lon 15

您是否尝试过以下链接中的答案?它应该做你想要实现的目标.

无限重定向循环由htaccess规则多语言

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)$  $1/ [R=301,L]

# now all urls have en/ de/ -> parse them
RewriteRule ^(en|de)/(.*)$  $2?lang=$1&%{query_STRING} [L]
Run Code Online (Sandbox Code Playgroud)