2014-03-06 71 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