2014-03-06 72 views
1

我正在制作一个Apache Web服务器多语言,我决定使用gettext与我的PHP代码。Apache + mod_rewrite添加查询字符串到我的URL当没有结尾斜杠

我的想法是重新编写所请求的所有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和最后一页将被提供。

一般来说,这种方法是行得通的,虽然我注意到奇怪的行为,这取决于我是否使用尾部斜线。

当我键入下面的网址到浏览器:

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?如何摆脱它?

回答

0

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

现在,我建议DirectorySlash关在这东西的情况下和处理后与mod_rewrite的地方更容易看到斜线/调整订货

+0

我怀疑mod_dir但是我太谨慎/懒得开关它关闭,因为我需要通过我的代码,并确保我使用它后面的斜杠。不过,我会测试它,看看它是否有帮助。 – PawelPredki