Dot-Htaccess

使用查詢字元串重定向連結,但僅來自特定頁面

  • December 12, 2019

我的問題是我想重定向在問號後包含特定片語特定查詢字元串的連結。

例如 - 重定向自:

http://example.com/first-category?p=1

到:

http://example.com/second-category

我有程式碼,它重定向問號後.htaccess包含的所有連結:p=1

RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]

但正如我所說 -?p=1存在於很多頁面(類別、製造商、部落格資訊頁面等)的連結中,上面的程式碼會將我的所有頁面重定向?p=1到 to /second-category,這是不正確的。

我需要定義另一個條件(該點包含first-category在問號之前的片語),但此程式碼無法正常工作:

RewriteCond %{REQUEST_URI} first-category
RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]

任何想法如何解決它?我不確定這裡有什麼不正確的。

RewriteCond %{REQUEST_URI} first-category
RewriteCond %{QUERY_STRING} p=1 [NC]
RewriteRule .* http://example.com/second-category? [R=301,L]

這應該“工作”,所以很可能你有一個記憶體問題。先前僅基於查詢字元串重定向所有內容的 301(永久)重定向將被瀏覽器記憶體。

但是,您不需要其他條件。指令的第一個參數RewriteRule(即pattern)已經與 URL 路徑匹配。在此範例中,.*匹配所有內容,因此您需要使其更具限制性。

另請注意,這些參數是正則表達式,因此與查詢字元串中的任何位置p=1匹配“p = 1” ,而不僅僅是在開頭,如您的範例中那樣。同樣,將在 URL 路徑中的任何位置匹配“第一類” ,而不僅僅是在開頭,如您的範例中那樣。first-category

請嘗試以下操作:

RewriteCond %{QUERY_STRING} ^p=1$
RewriteRule ^first-category$ http://example.com/second-category? [R=301,L]

這與請求完全/first-category?p=1匹配(區分大小寫)。請注意,RewriteRule 模式上的斜杠前綴在**目錄上下文中被省略。

條件上的NC標誌不是必需的,除非您也明確需要匹配P=1

如果您使用的是 Apache 2.4+,那麼您可以使用(Query String Discard) 標誌而不是在替換字元串的末尾QSD附加一個單獨的字元,以防止請求中的查詢字元串被隱式複製到替換?

您需要在測試前清除瀏覽器記憶體。建議使用 302(臨時)重定向進行測試以避免記憶體問題。

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