从URL中删除语言代码,并通过htaccess保存为环境变量

时间:2013-08-04 19:22:13

标签: apache .htaccess mod-rewrite

我想从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。编辑(。+)for(。*)

2 个答案:

答案 0 :(得分:1)

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

# 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})

捕获的值

答案 1 :(得分: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 | / EN / | / EN /动态/路径。

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