2012-01-23 23 views
0

啓動一個新的客戶端的新網站。他們的舊網站大約有50種產品,不幸的是,舊的產品名稱不匹配到新的URL模式簡單的mod_rewrite RewriteRule爲凌亂的傳統網址

舊網址的例子:

example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription

example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123

example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers

(舊網址有時會打150+個字符。)

新的URL:

example.com/products/category/actual-product-name

有沒有固定的,可識別的圖案從舊的產品名稱,轉到新的。有類別。

我試過簡單的mod_alias重定向,但明白我需要一個RewriteRule來代替。但我有問題。我需要的僅僅是這50個URL中的每一個的1對1重定向。我以爲我可以做這樣的事情:

RewriteRule ^/products.aspx?category=Foo&product=ProductName 
    /products/category/new-product-name/ [R=301,NC] 

但是,這是行不通的。我知道這應該很簡單,但我被卡住了。有任何想法嗎?

+0

究竟什麼不起作用? – Jonathan

+0

對於好的形式,您應該可以避開這段時間,例如'產品\ .aspx'。另外,請參閱下面有關RewriteCond的答案。稍後在.htaccess中是否有其他RewriteRules會影響重寫的URL?你可能想在你做外部重定向的地方使用'L'標誌。 – JMM

+0

感謝JMM的迴應。沒有其他重寫規則。該網站的其餘部分能夠用簡單的重定向來照顧。也沒有外部重定向。 –

回答

1

使用下面的模式爲您的其他重定向ur LS。請注意,您會轉義特殊字元?.和空間在他們

RewriteEngine on 
RewriteBase/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC] 
RewriteRule^/products/category/new-product-name/ [R=301,NC] 
+0

+1未使用明顯(更復雜)'%{QUERY_STRING}' – Gerben

+0

感謝您的回覆。這有效,但有一個令人迷惑的問題與網址。它顯示爲:'/ products/category/new-product-name /?category = Foo&product = SuperLongN ...'不是一個破壞者,但令人費解。另外,我沒有使用RewriteBase,因爲我必須直接將它放在虛擬主機中。 –

+0

@the_zero在最後添加一個'?'來抑制原始查詢字符串,即'RewriteRule ^/products/category/new-product-name /? [R = 301,NC]' –

0

看看的RewriteMap指令。

products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name 

而在你httpd.conf

RewriteMap productmap /path/to/map/file.txt 
RewriteRule ^(.*) ${productmap:$1} [R=301,NC] 

提示:

您可以在一個文本文件類似規定。如果這是你想要永久重定向,請確保您設置適當的Cache-ControlExpires標題指示瀏覽器緩存301.

+0

將此與Ulrich的解決方案結合使用,因爲路徑不包含查詢字符串。 – Gerben

0

前添加\你可以嘗試這樣的事情:

RewriteEngine On 

RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$ 

RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L] 

注:

  1. 在每個目錄(。 htaccess)上下文中,每個目錄前綴將被刪除,因此無法使用^/啓動RewriteRule模式。

  2. 您必須使用RewriteCond來匹配查詢字符串。

  3. 正如另一個答案所述,如果您有權訪問此站點的httpd.conf/vhost定義,則RewriteMap解決方案可能適用於此情況。我不知道如何與查詢字符串工作。

  4. 對於這樣的事情,將所有這些URL重寫爲服務器端腳本並使用腳本爲每個URL執行HTTP重定向可能是更好的解決方案。