首页 > 解决方案 > .htaccess,如何将语言组合并添加到路径

问题描述

我无法组合多个规则。我就是想不通怎么写.htaccess

我的.htaccess

RewriteEngine on
RewriteRule (.*) web/$1 [L]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

我将如何结合这些?现在只有第一条规则有效web/$1

还有我怎样才能在所有这些中添加一个额外的重定向到语言?

为了澄清我想做的事情:

我检查了其他问题,但我真的不明白它是如何工作的,感谢任何帮助。

标签: .htaccessmod-rewrite

解决方案


主要问题是您的指令顺序错误。您应该在重写之前重定向到.www.example.comweb/<whatever>

例如:

RewriteEngine on

# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# Internally rewrite to "web" subdirectory.
RewriteRule (.*) web/$1 [L]

我假设您.htaccess在子目录中有另一个文件/web也使用 mod_rewrite - 否则最后一个指令将导致重写循环。

之后添加/en到 url 使其看起来像www.example.com/en

您需要在将 URL 重写到子目录之前执行此操作。web我假设您可能正在请求www.example.com/<page>,这应该重定向到www.example.com/en/<page>

尝试以下操作:

RewriteEngine on

# Redirect example.com to www.example.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=302,L]

# Redirect to "/en" if not already present at the start of the URL
RewriteCond %{REQUEST_URI} !^/en/
RewriteRule (.*) http://%{HTTP_HOST}/en/$1 [R=302,L]

# Internally rewrite to "web" subdirectory.
RewriteRule (.*) web/$1 [L]

该指令在重定向之前RewriteCond检查 URL 路径是否不以 ( !) 开头。/en/

注意我已将重定向更改为 302(临时)。在使用 301 之前先测试 302,以避免浏览器缓存问题。并确保在测试前清除浏览器缓存。


推荐阅读