2017-02-28 22 views
0

由於某種原因,我遇到了一個我認爲應該很容易的重寫規則問題。簡單的Apache重寫問題傳遞變量

我想重寫site.com/page.html?1到site.com/page.php?p=1 和site.com/page.html到site.com/page.php

這裏是我認爲應該工作,但不會:

RewriteRule page.html?([^/\.]+)/?$ page.php?p=$1 [L,QSA] 

回答

2

查詢字符串(在?之後的部分URL)不包含在RewriteRule的正則表達式部分中。只是請求的頁面路徑/名稱。如果要捕獲查詢字符串,則需要使用RewriteCond並捕獲%{QUERY_STRING}環境變量。事情是這樣的:

RewriteCond %{QUERY_STRING} (\d*) 
RewriteRule page.html page.php?p=%1 [L,QSA] 

通知,我現在捕捉到RewriteCond查詢字符串,從RewriteRule正則表達式的末尾刪除後?...並且也改變了變數與%1代替$1指替換到捕獲的條件而不是規則。您還可以更改條件中的正則表達式,以更好地匹配您想要的內容。

編輯:另外,請記住QSA會附加任何查詢字符串,這些查詢字符串在重寫的URL中不存在。因此,如果您將其留在那裏,如果您傳遞的查詢字符串類似?1,則仍然會在1的URL後附加一個帶有空值的密鑰(?1 =>array(1=>''))。如果你不需要額外的查詢字符串值,只需刪除QSA,或者如果你想要額外的值並且不關心空白的查詢字符串參數(除非你循環遍歷所有的$ _GET),那麼保留它在那裏。

+0

然後檢查並確保'p'設置爲**,**'p'不爲空,因爲這將始終具有設置​​的$ _GET ['p']'。我個人使用了下面的代碼: 'if(isset($ _ GET ['p'])&&!empty($ _ GET ['p']))' – Kaboom

+0

@Kaboom您也可以將條件中的正則表達式更改爲類似'(\ d +)'需要至少一個數字或其他某種需要使用錨點或類似物的值。如果條件模式失敗,則會跳過RewriteRule,這意味着如果沒有要匹配的規則,則會生成404錯誤(頁面不存在爲* .html),並且可以加載apache ErrorDocument來處理該錯誤。我只是把這個模式做得很寬泛,所以它會加載所需的'* .php'頁面。 –

+0

謝謝,這個作品很棒。我遇到的唯一問題是變量是字符串而不是數字。 例如,如果我嘗試通過site.com/page.html?test它不會通過它。但是,如果我通過site.com/page.html?123它沒有proplem。 有沒有辦法讓這兩個功能? 謝謝 – bakingsoda

-1

如果p值始終是一個整數,嘗試:

RewriteRule page\.html\?([\d]+)$ page.php?p=$1 [L,QSA] 

測試在https://regex101.com/r/3AFu0A/1

+0

儘管正則表達式匹配查詢字符串,但查詢字符串不包含在正則表達式中以匹配「重寫規則」。只是請求的URI名稱/路徑直到但不包括查詢字符串。 –