Apache 从URL中剥离语言代码,并通过htaccess另存为环境变量

Apache 从URL中剥离语言代码,并通过htaccess另存为环境变量,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我想从URL中剥离一个语言代码并保存该代码,以便可以通过$\u服务器变量或$\u GET在PHP中访问它。网站网址如下: http://www.example.com/dir%20ectory/dynamic/url/ http://www.example.com/dir%20ectory/EN/dynamic/url/ 而目录名作为环境变量存储在htaccess的“PATH”中 第5行的rewriterule逻辑上将语言代码保存到%{ENV:LANG},尽管LANG的$\u GET值为空。此

我想从URL中剥离一个语言代码并保存该代码,以便可以通过$\u服务器变量或$\u GET在PHP中访问它。网站网址如下:

http://www.example.com/dir%20ectory/dynamic/url/
http://www.example.com/dir%20ectory/EN/dynamic/url/
而目录名作为环境变量存储在htaccess的“PATH”中

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

http://www.example.com/dir%20ectory/EN/static/img.png
不要在页面上显示,这意味着图像URL由第12行处理,而不是第10行(这很有意义,因为我使用%{REQUEST_FILENAME},它不会被重写)。我想知道我在%{ENV:LANG}上犯了什么错误,以及如何从%{REQUEST_FILENAME}中删除语言代码


更新:存储了语言,但不存储以语言代码结尾的URL。为(.*)

编辑(+++),您不需要条件,也不需要设置enif(这是一个完全不同的模块,不与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})
您不需要条件,也不需要
setenif
(这是一个完全不同的模块,不与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})

使用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/dynamic/path


请注意,目录不在重写规则中,这是因为它也不在字符串中。(例如,请参见$\u GET['path']的值)。还要注意,重写规则(第4行)将匹配项重写为$3,而不是$2。这是因为$2也可以以/开头,而$3是(.*)的结果,因此没有以/开头。启动/导致“{REQUEST_FILENAME}”更改。

使用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/dynamic/path


请注意,目录不在重写规则中,这是因为它也不在字符串中。(例如,请参见$\u GET['path']的值)。还要注意,重写规则(第4行)将匹配项重写为$3,而不是$2。这是因为$2也可以以/开头,而$3是(.*)的结果,因此没有以/开头。启动/会导致“{REQUEST_FILENAME}”更改。

谢谢,这很有意义。然而,我面临另一个问题“RewriteCond%{REQUEST_FILENAME}!-f”仍然不起作用,因为(我相信)该变量没有用上述行重写。如何确保www.example.com/dir%20ectory/GB/static/img.png进入www.example.com/dir%20ectory/static/img.png?@Jeffrey我不知道这个
RewriteCond%{REQUEST_FILENAME}在哪里-f
是出于这个原因,我对这个问题进行了一些编辑来详细说明这个问题。谢谢,这很有道理。然而,我面临另一个问题“RewriteCond%{REQUEST_FILENAME}!-f”仍然不起作用,因为(我相信)该变量没有用上述行重写。如何确保www.example.com/dir%20ectory/GB/static/img.png进入www.example.com/dir%20ectory/static/img.png?@Jeffrey我不知道这个
RewriteCond%{REQUEST_FILENAME}在哪里-f
是出于借口,我对问题进行了一些编辑,以详细说明问题。