繁体   English   中英

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

[英]htaccess multi language site with sub directories, and default 301

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

http://www.domain.com/en/
http://www.domain.com/sw/
http://www.domain.com/ie/

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

http://dev.domain.com/devname/projectname/

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

http://dev.domain.com/devname/projectname/en/

这是我的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

以上将实际重定向到:

http://dev.domain.com/home/webserver_dir/devname/projectname/en/

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

http://dev.domain.com/en/

所以我的问题是:如何使语言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

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

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

无限重定向循环由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]

如果.htaccess一定不能改变

DEV服务器项目的<VirtualHost>配置更改为

<VirtualHost *:80>
    ServerName dev.domain.com
    ServerAlias project.domain.com
    DocumentRoot "/home/webserver_dir/devname/projectname"
</VirtualHost>

这些更改通常会出现在httpd-vhosts.conf文件中。 你的.htaccess文件现在有了

RewriteBase /

root标记为开发服务器和实时服务器的基本目录。

如果您尝试对项目进行版本测试或在同一个开发主机上测试多个项目,则必须将命名方案合并到域名而不是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>

最重要的是,你不能使用相同的.htaccess文件规则,不要使用不同的部署目录,除非你使用if-else mumbo jumbo的mod-rewrite方式,这只会在你上线后添加杂乱。

对于规则透明地工作,阿帕奇只能看到和应用上发生了什么的规则(即自带的内容后/devX/projectX/目录),这是什么偏移DocumentRoot这里为我们做。

如果.htaccess的最小mod可以

并非每个人都可以访问Apache的.conf文件。 某些主机正确拒绝修改它们的请求。 这就是为什么,如果他们至少保持启用mod-rewrite ,很多网站的设置都可以修改。 其中之一是使用RewriteBase来处理不同的部署目录。

因此,如果您保持RewriteBase / on live但将其更改为RewriteBase /devX/projectX/进行开发 ,那么大多数RewriteRule应该按原样运行。 因此, /devname/projectname/应该正确地重定向到/devname/projectname/en/


您对([az{2}]+)的使用不正确。 您可能意味着([az]{2})准确捕获两个字母。 如果你打算捕获两个或更多,它将成为([az]{2,}) 因此,您的默认加载重写将成为

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

你是正确的,假设你需要这个正则表达式用于所有后续规则,否则它们将无法匹配。 所以,你的RewriteRulecasestudies将无法正常工作。 不关心语言前缀的一种更简单的方法是删除URL路径锚点的^ start

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

你的最后一个RewriteRule匹配^(/)?$不是必需的,因为你已经对所有没有语言目录前缀的URL进行301重定向到/en/$1以上,理想情况下应该是

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

否则, /en也会被重定向到/en/en

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM