我在重定向到.htaccess使用 drupal 7 時遇到了一些實際問題。
我有這樣的鏈接:
example.com/vid/category/filter?subcat_filter_depth=125
我需要他們去:(在同一個域上)
example.com/vid/category/filter?type=All&subcat_filter_depth=125
之后=的數字可能不同,如 67 或 32 等。這意味著可以是任何數字,并且原始鏈接末尾的任何數字也需要位于新鏈接的末尾。
我認為鏈接幾乎是相同的路徑只是不同的過濾器這一事實是導致問題的原因,因為即使是 Drupal 重定向 url 模塊也不允許它嘗試在它們發生時一次添加一個。
這是我嘗試過的一切:
RedirectMatch 301 ^/vid/category/filter?subcat_filter_depth=(.*) /vid/category/filter?type=All&subcat_filter_depth=$1
RewriteRule ^(.*)/vid/category/filter?subcat_filter_depth=(.*) $1/vid/category/filter?type=All&subcat_filter_depth=$2 [R=301]
RedirectMatch ^/vid/category/filter?subcat_filter_depth=(.*) ^/vid/category/filter?type=All&subcat_filter_depth=$1
RedirectMatch 301 ^(.*)/filter?subcat_filter_depth=(.*) ^$1/filter?type=All&subcat_filter_depth=$2
RedirectMatch ^/(.*)/filter?subcat_filter_depth=(.*) ^/$1/filter?type=All&subcat_filter_depth=$2
RewriteRule "^/(.*)/filter?subcat_filter_depth=(.*)" "^/$1/filter?type=All&subcat_filter_depth=$2"
mod_rewrite 已打開,并且在 Debian Apache 上運行的內部有一個 AllowOverride pathed/to/the/.htaccess 檔案 .. 幾乎是最新<Directory>版本。<VirtualHost>000-default.conf
我知道 mod_rewrite 正在作業,因為如果我添加錯誤規則或重寫語法錯誤,我會收到錯誤 500 回應頁面。
我已經搜索并嘗試了幾乎所有我能想到的東西,但似乎沒有任何效果。
任何幫助進行排序和運行將不勝感激!
uj5u.com熱心網友回復:
( mod_alias RedirectMatch) 和RewriteRule(mod_rewrite) 指令都只與 URL 路徑匹配,特別是不包括查詢字串。
要匹配查詢字串,您需要使用RewriteRule額外的條件(RewriteCond指令)來檢查QUERY_STRING服務器變數。
.htaccess在任何現有的重寫之前,此規則還需要靠近檔案頂部。
例如:
RewriteCond %{QUERY_STRING} ^subcat_filter_depth=\d $
RewriteRule ^vid/category/filter$ /$0?type=All [QSA,R=302,L]
這重定向example.com/vid/category/filter?subcat_filter_depth=<number>到example.com/vid/category/filter?type=All&subcat_filter_depth=<number>.
在模式.htaccess匹配的 URL 路徑上沒有斜杠前綴。IE。(不是)。RewriteRule ^vid/category^/vid/category
$0是一個反向參考,包含來自RewriteRule pattern的匹配 URL-path 。
QSA導致原始查詢字串(例如subcat_filter_depth=125)附加到替換字串中所述的查詢字串,即。type=All變成type=All&subcat_filter_depth=125.
使用 302(臨時)重定向進行測驗以避免潛在的快取問題。僅更改為 301(永久)重定向 - 如果這是意圖 - 一旦您確認它按預期作業。
在測驗之前,您可能需要清除瀏覽器快取。
uj5u.com熱心網友回復:
我能夠想出一個在我標記為正確的答案(上圖)之前有效的解決方案,因為我的解決方案并不那么優雅。
經過更多研究后,我確實意識到我需要使用帶有 %{QUERY_STRING} 的 RewriteCond 來實作我想要實作的目標。
再次不像上面的答案那么優雅......但這是我的代碼:
RewriteCond %{REQUEST_URI} ^/vid/category/filter [NC]
RewriteCond %{QUERY_STRING} ^(.*)=(.*)
RewriteRule (.*) /vid/category/filter?type=All&subcat_filter_depth=%2 [R=301,L]
這實際上將 url 保留在瀏覽器中,因為它是輸入的 (/var/category/filter?subcat_filter_depth=) 但顯示頁面好像是使用 type=ALL 的正確過濾器打開的,并且在瀏覽器和 Drupal 中都沒有產生錯誤博客。
上面的解決方案在單獨解釋時更有用,并且讓我更好地理解了如何分解 URL 并將其重新組合在一起進行修改,特別是在處理具有像唯一 ID 一樣變化的變數的字串時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/424272.html
