2017-07-14 48 views
0

我已經搜索了幾個小時,但我找不到解決方案。 我剛剛建立了一個與舊網站有不同搜索網址的新網站。我試圖捕獲指向舊網站的搜索查詢並將它們發送到新網站搜索。 如: advanced_search_result.php search_in_description = 1個&關鍵字=發電機重寫規則將舊搜索轉發到新搜索

重定向到新的站點搜索,如:?? 的index.php路線=產品/搜索&搜索=發電機

我試着以下的變化沒有任何運氣。

RewriteRule ^advanced_search_result\.php?.*keywords=(.*)$ index.php?route=product/search&search=$1 [R=301,L] 

任何幫助,將不勝感激。

+0

什麼是「沒有任何鎖定」實際上是什麼意思?怎麼了?你有沒有看到重定向?這是錯的嗎?它會崩潰嗎?宇宙是否內爆? – arkascha

+0

確保http服務器進程能夠讀取您的動態配置文件,確保所有文件的解釋都已啓用('AllowOverride'指令),檢查是否啓用了重寫模塊並使用'RewriteEngine on',確保文件位於正確系統的正確位置並監控您的http服務器日誌文件。 – arkascha

+0

一般提示:在99%的情況下,將這種重寫規則放置在舊主機配置中而不是使用動態配置文件更有意義。 – arkascha

回答

0

你的問題是你試圖映射一個模式,包括查詢字符串,這是RewriteRule不可能的。這是明確記錄。你需要使用一個RewriteCond

RewriteEngine on 
RewriteCond %{QUERY_STRING} ^(?:[^&]*&)*keywords=([^\&]*) 
RewriteRule ^/?advanced_search_result\.php$ /index.php?route=product/search&search=%1 [R=301,L] 

原因是,在一個RewriteRule模式只對請求的URL的路徑組件相匹配。查詢字符串是而不是的一部分。匹配查詢字符串只能在RewriteCond中使用%{QUERY_STRING}變量,因爲這樣的條件可以針對某種模式測試任意字符串,而不僅僅是URL的路徑組件。在這樣的條件下捕獲的令牌可以在以下RewriteRule中被%1引用,而$1引用該規則本身的捕獲。

詳細信息在official documentation of the rewriting module中解釋,在處理重寫或重定向規則時應該經常諮詢。它寫得很好,並附帶很好的例子。


而且一般提示:你應該總是喜歡在http服務器(虛擬)主機配置,而不是使用動態配置文件(.htaccess風格文件)裏這樣的規則。這些文件出了名的錯誤,很難調試,他們真的放慢了服務器。只有當你無法控制主機配置(讀取:真正便宜的主機服務提供商)或者如果你有一個依賴編寫自己的重寫規則的應用程序(這是一個明顯的安全噩夢) )。

+0

謝謝,請您詳細說明重寫條件如何工作與重寫規則? –

+0

謝謝。這對我來說現在更有意義了。我已閱讀了一些文檔,但感到困惑。最後一個問題,在你的例子中,爲什麼%1用來引用搜索字符串而不是%2? –

+0

使用你的例子,我得到重定向,但它是不正確的。它重定向到: /index.php?route=product/search&search=search_in_description=1 –