Apache-2.2

使用 QUERY_STRING 重寫規則不起作用

  • October 23, 2020

在 Apache 伺服器上,我需要將 mydomain.com/something/?p=value 重寫為 mydomain.com/something/?page=value

我試過:

RewriteEngine On
RewriteCond %{QUERY_STRING} p=(.*)
RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]

但是不要炒鍋,能幫幫我嗎?

RewriteCond %{QUERY_STRING} p=(.*)
RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]

這裡有很多“錯誤”:

  • RewriteRule 模式,即。^(.*)/p=$, 永遠不會匹配,因為p=它不會作為 URL 路徑的一部分出現(它是查詢字元串的一部分)。該RewriteRule 模式僅與 URL 路徑匹配,特別是不包括查詢字元串。因此,上述內容對於所述範例 URL 沒有任何作用。
  • 您正在使用伺服器變數代替替換字元串中QUERY_STRING所需的 URL 參數。但顯然是整個“查詢字元串”,所以最終會構造一個格式錯誤的查詢字元串:.value``QUERY_STRING``page=p=<value>
  • 使用該QSA標誌會導致請求上的原始查詢字元串與您在替換字元串中使用的查詢字元串合併。因此,這將導致被附加,這不是您所需要的。您正在尋找替換現有的查詢字元串。&p=<value>
  • RewriteRule ^(.*)/p=$ $1?page=- 您正在從RewriteRule 模式中的擷取組中排除尾部斜杠,因此這將有效地從重寫的 URL 中刪除尾部斜杠。這與您的範例不同。
  • 您似乎需要內部重寫(沒有外部重定向)並且您“僅”更改單個 URL 參數的名稱。這是您通常會在應用程序中解決的問題,而不是在 Apache 中重寫 URL。(?)

請嘗試以下操作:

RewriteEngine On

# Internally "rewrite" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$
RewriteRule (.*/)$ $1?page=%1 [L]

這匹配以斜杠結尾的任何 URL 路徑(根據您的範例)。%1反向引用是指最後匹配的CondPattern中擷取的組,即。pURL 參數的值。假定這p=<value>是請求中唯一的 URL 參數。


**更新:**它似乎不起作用……如果我打電話localhost/list/?p=2我只是得到localhost/list/?p=2

是的,可見 URL 不會改變,因為這是內部“重寫”(正如您在問題中所要求的那樣)。URL 在內部被重寫為list/?page=2. (還有一點list/?page=2嚴格來說不是一個有效的端點——它需要進一步重寫,也許通過 mod_dir 來形成一個有效的請求。例如list/index.php?page=2?)

如果您希望 URL 明顯更改,那麼也許您確實需要外部“重定向”?為此,您需要在RewriteRule 替換字元串中包含斜杠前綴並添加R( redirect) 標誌。例如:

# Externally "redirect" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$
RewriteRule (.*/)$ /$1?page=%1 [R=302,L]

如果我修改規則得到localhost/list/?p=2&?p=2如下:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^p=([^&]*)$
RewriteRule (.*/)$ $1&?page=%1 [L]

/list/&我得到“在此伺服器上找不到請求的 URL 。” 作為 ‘?’ 削減重寫

如果您請求localhost/list/?p=2&?p=2(但為什麼?),那麼上述指令將不會做任何事情,因為條件不匹配。

為什麼要&RewriteRule 替換字元串中添加 a?(這沒有意義嗎?)/list/&如果處理了規則,那確實會導致表單的 URL 路徑。但如前所述,不會針對您聲明的 URL 進行處理?

引用自:https://serverfault.com/questions/1039696