当没有使用尾部斜杠时,Apache + mod_rewrite将查询字符串添加到我的URL

时间:2014-03-06 10:24:56

标签: php apache mod-rewrite query-string

我正在努力使Apache Web服务器多语言,我决定使用我的PHP代码的gettext。

我的想法是重写所有请求的网址,并通过使用该国家/地区代码简单创建查询字符串参数来包含双字母国家/地区代码,例如

https://domain.com/newpage/en -> https://domain.com/newpage?l=en
https://domain.com/newpage/en/about -> https://domain.com/newpage/about?l=en

然后将通过rewrite_mod进一步解析,最终页面将被提供。

一般来说,这种方法很有效,但我发现奇怪的行为取决于我是否使用尾部斜杠。

当我在浏览器中输入以下网址时:

https://domain.com/newpage/en/

一切都很好,我得到了该页面的英文版本。

但是,当我留下尾随斜线时:

https://domain.com/newpage/en

地址变为

https://domain.com/newpage/en/?l=en

我使用的规则如下:

RewriteRule /newpage/(en|pl|fi)(/?)(.*) /newpage/$3?l=$1 [QSA,S=1]

这些是来自rewrite_mod的日志,显示了两种情况之间的区别:

https://domain.com/en
(2) init rewrite engine with requested uri /newpage/en/
(3) applying pattern '/newpage/(en|pl|fi)(/?)(.*)' to uri '/newpage/en/'
(2) rewrite '/newpage/en/' -> '/newpage/?l=en'
(3) split uri=/newpage/?l=en -> uri=/newpage/, args=l=en&l=en
(2) prefixed with document_root to /var/www/newpage/index.php
(1) go-ahead with /var/www/newpage/index.php [OK]

https://domain.com/en/
(2) init rewrite engine with requested uri /newpage/en/
(3) applying pattern '/newpage/(en|pl|fi)(/?)(.*)' to uri '/newpage/en/'
(2) rewrite '/newpage/en/' -> '/newpage/?l=en'
(3) split uri=/newpage/?l=en -> uri=/newpage/, args=l=en
(2) prefixed with document_root to /var/www/newpage/index.php
(1) go-ahead with /var/www/newpage/index.php [OK]

除了'split'消息之外,两者几乎完全相同,在第一种情况下显示额外的l = en参数。

更奇怪的是,如果我禁用mod_rewrite,行为不会停止,即输入

https://domain.com/newpage/en

将地址更改为

https://domain.com/newpage/en/?l=en

并产生错误404.当我转到

时,我得到了同样的错误
https://domain.com/newpage/en/

但浏览器中的地址不会更改。 Apache日志没有说明这一点。

额外参数来自哪里,如果它不是mod_rewrite?如何摆脱它?

1 个答案:

答案 0 :(得分:0)

看起来像是mod_dir的DirectorySlash和你的重写之间的交互。在2.4中,mod_dir对它将要处理的请求变得更加积极,下一个2.4版本(2.4.8或更高版本,后代)将避免对重写结果采取mod_dir操作 - 也许这是你的问题? / p>

现在,我建议在这个东西的上下文中使用DirectorySlash OFF并使用mod_rewrite处理尾部斜杠,以便更容易看到/调整顺序