【发布时间】:2014-04-08 22:02:27
【问题描述】:
我正在制作一个多语言的 Apache Web 服务器,我决定在我的 php 代码中使用 gettext。
我的想法是重写所有被请求并包含两个字母国家代码的 URL,方法是使用该国家代码简单地创建一个查询字符串参数,例如
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 进一步解析并提供最终页面。
一般来说,这种方法是有效的,虽然我注意到奇怪的行为,这取决于我是否使用斜杠。
当我在浏览器中输入以下 URL 时:
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,额外参数从何而来?如何摆脱它?
【问题讨论】:
标签: php apache mod-rewrite query-string