1

我想从 URL 中剥离语言代码并保存此代码,以便可以通过 $_SERVER 变量或 $_GET 在 PHP 中访问它。网站网址如下:

http://www.example.com/dir%20ectory/dynamic/url/
http://www.example.com/dir%20ectory/EN/dynamic/url/

而目录名称作为环境变量存储在 htaccess 中的“PATH”中。

# Set PATH variable
RewriteRule .* - [E=PATH:/dir\ ectory]

# Using belows method, remove the Language code, and save it to LANG
RewriteRule ^%{ENV:PATH}/([a-zA-Z]{2})/(.*)$ %{ENV:PATH}/$2 [E=LANG:$1]

# Do some more stuff, all working fine (even w/o the above rewrite)
#....

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^index.php [NC]
RewriteRule ^(.*)$ %{ENV:PATH}/index.php?path=$1&lang=%{ENV:LANG} [L]

第 5 行的重写逻辑将语言代码保存到 %{ENV:LANG},尽管 lang 的 $_GET 值为空。此外,通过以下方式请求的图像(和其他静态内容):

http://www.example.com/dir%20ectory/EN/static/img.png

不在页面上显示,这意味着图像 URL 由第 12 行处理,而不是第 10 行(这是有道理的,因为我使用了未重写的 %{REQUEST_FILENAME})。我想知道我在使用 %{ENV:LANG} 时做错了什么以及如何从 %{REQUEST_FILENAME} 中删除语言代码。

更新:语言被存储,但不是以语言代码结尾的 URL。为 (.*) 编辑 (.+)

4

2 回答 2

1

您不需要条件,也不需要SetEnvIf(这是一个完全不同的模块,不与重写指令交互)。您只需要:

# Set PATH variable, not sure if this is the correct way but it works...
RewriteRule .* - [E=PATH:/dir\ ectory]

RewriteRule ^%{ENV:PATH}/([a-zA-Z]{2})/(.+)$ %{ENV:PATH}/$2 [L,E=LANG:$1]

E标志允许您设置环境变量,在这种情况下LANG,它将其设置为第一组捕获的值,([a-zA-Z]{2})

于 2013-08-04T20:30:24.493 回答
0

使用 Jon Lin 提供的信息,在解决问题几天后,我想出了以下解决方案。

# Set PATH variable
RewriteRule .* - [E=PATH:/dir\ ectory]

# Using belows method, remove the Language code, and save it to LANG
RewriteRule ^([a-zA-Z]{2})(|/|/(.*))$ $3 [E=LANG:$1]

# Do some more stuff, all working fine (even w/o the above rewrite)
#....

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^index.php [NC]
RewriteRule ^(.*)$ %{ENV:PATH}/index.php?path=$1&lang=%{ENV:LANG} [L]

这将支持如下路径:/EN | /ZH/ | /EN/动态/路径。

请注意,目录不在 RewriteRule 中,这是因为它也不在字符串中。(例如,查看 $_GET['path'] 的值)。另请注意,重写规则(第 4 行)将匹配项重写为 $3 而不是 $2。这是因为 $2 也可能以 / 开头,而 $3 是 (.*) 的结果,因此没有以 / 开头。开始 / 导致“%{REQUEST_FILENAME}”改变。

于 2013-08-06T21:36:09.783 回答