【问题标题】:Apache+mod_rewrite adding query string to my URL when no trailing slash is used当不使用斜杠时,Apache+mod_rewrite 将查询字符串添加到我的 URL
【发布时间】: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


    【解决方案1】:

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

    目前,我建议在此内容的上下文中关闭 DirectorySlash,并使用 mod_rewrite 处理尾部斜杠,以便更容易查看/调整排序

    【讨论】:

    • 我怀疑 mod_dir 但我过于谨慎/懒惰而无法将其关闭,因为我需要检查我的代码并确保在其中使用斜杠。不过,我会对其进行测试,看看是否有帮助。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多