由於某種原因,我遇到了一個我認爲應該很容易的重寫規則問題。簡單的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]
由於某種原因,我遇到了一個我認爲應該很容易的重寫規則問題。簡單的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]
查詢字符串(在?之後的部分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),那麼保留它在那裏。
如果p
值始終是一個整數,嘗試:
RewriteRule page\.html\?([\d]+)$ page.php?p=$1 [L,QSA]
儘管正則表達式匹配查詢字符串,但查詢字符串不包含在正則表達式中以匹配「重寫規則」。只是請求的URI名稱/路徑直到但不包括查詢字符串。 –
然後檢查並確保'p'設置爲**,**'p'不爲空,因爲這將始終具有設置的$ _GET ['p']'。我個人使用了下面的代碼: 'if(isset($ _ GET ['p'])&&!empty($ _ GET ['p']))' – Kaboom
@Kaboom您也可以將條件中的正則表達式更改爲類似'(\ d +)'需要至少一個數字或其他某種需要使用錨點或類似物的值。如果條件模式失敗,則會跳過RewriteRule,這意味着如果沒有要匹配的規則,則會生成404錯誤(頁面不存在爲* .html),並且可以加載apache ErrorDocument來處理該錯誤。我只是把這個模式做得很寬泛,所以它會加載所需的'* .php'頁面。 –
謝謝,這個作品很棒。我遇到的唯一問題是變量是字符串而不是數字。 例如,如果我嘗試通過site.com/page.html?test它不會通過它。但是,如果我通過site.com/page.html?123它沒有proplem。 有沒有辦法讓這兩個功能? 謝謝 – bakingsoda