2012-12-28 39 views
0

我是URL重寫的新手。導致內部服務器錯誤的URL重寫

我在主頁上有一個錨文本,點擊後會打開另一頁。點擊鏈接時瀏覽器中顯示的目標URL是 http://example.com/index.php?p=one/two/three/pdp&abc=436

相反,我想在URL http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436顯示。

所以基本上我要找的是一個 /兩/三

到 購物/店/ iPad的

在URL替代我想要的網址http://example.com/index.php?p=one/two/three/pdp&abc=436 看起來像http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

請注意,我有14,000頁,所以無法在物理上去&無處不在。 我希望這發生使用url重寫。所以在我已經添加到.htaccess下面的行的根。

RewriteEngine On 
RewriteRule ^shopping/shop/ipad/?$ one/two/three/pdp [NC,L] 

但這是給內部服務器錯誤。

我該如何顯示更好的網址? 感謝

+0

'RewriteRule'不上查詢蜇直接工作LY。你需要看看'RewriteCond'。 –

+0

看看Apache的錯誤日誌。確保mod_rewrite已啓用。 ('a2enmod rewrite') – Kenny

回答

1

你可以試試這個:

RewriteEngine On 
RewriteBase/
RewriteCond %{QUERY_STRING} p=one/two/three/(.*) 
RewriteRule .* http://example.com/index.php?p=shopping/shop/ipad/%1? [R=301,L] 

會重定向:

http://example.com/index.php?p=one/two/three/pdp&abc=436

要:

http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

我假設`p=one/two/three/p=shopping/shop/ipad/是常數。如果它們是變量,則應更新問題並描述它們的關係和模式,以便能夠捕獲並替換它們。

第二個選項:

RewriteEngine On 
RewriteBase/
RewriteCond %{QUERY_STRING} p=one/two/three/([^/]+)&([^/]+)=([^/]+).* 
RewriteRule .* http://example.com/index.php?p=shopping/shop/ipad/%1/%2/%3? [R=301,L] 

會重定向:

http://example.com/index.php?p=one/two/three/anything1&anything2=anything3

要:

http://example.com/index.php?p=shopping/shop/ipad/anything1/anything2/anything3

+0

謝謝Felipe。這一個工作。我正在尋找一個微小的變化。假設我想要http://example.com/index.php?p=shopping/shop/ipad/pdp/abc/436而不是http://example.com/index.php?p=shopping/shop/ipad/pdp&abc = 436我該怎麼做?非常感謝# – Anita

+0

我會在幾分鐘內更新我的答案。 –

+0

@Anita更新了我的答案。 –

0

試試這個:

Redirect 301 old_url new_url 

例子:

Redirect 301 index.php?p=one/two/three/pdp&abc=436 http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436 

我希望你解決你的問題,對不起,如果你不這樣做,我沒試過。

問候。

0

RewriteRule只會在網址。(/index.php部分),而不是查詢字符串(在?後的所有內容)的路徑部分的工作。您需要一個RewriteCond來捕獲查詢字符串,然後是一個RewriteRule,它只保留路徑部分,但會更改查詢字符串。

試試下面的(我不能在那一刻,遺憾驗證):

RewriteCond %{QUERY_STRING} p=one/two/three/pdp/&(.*) 
RewriteRule *     /index.php?p=shopping/shop/ipad/&%1 [NC,R=301,L] 

第一條規則基本上說「如果查詢字符串匹配這種模式(記住額外的東西) 「,第二條規則說:」然後更改什麼/index.php?p=shopping…並添加你從Cond記得的東西「。所述%1恢復參照到最後電導率匹配的捕捉緩衝區,而不是$1,其是用於反向引用到規則圖案。

第二條規則可以匹配所有內容,因爲只有在第一條規則匹配時纔會觸發。 R=301表示執行代碼301(例如)的實際重定向,因爲否則訪問者將永遠不會看到更改。有關此方法

兩件事情:

  1. 在你的頁面的鏈接將不會改變,它仍然會顯示在鼠標懸停和類似…one/two/three…。只有當有人實際訪問該更改時纔會應用更改。

  2. 這個實際例子很脆弱;它首先取決於查詢字符串的p=部分,以及它後面的內容。如果您有更多案例,您需要更改正則表達式。

欲瞭解更多信息,請參閱http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

0

另一種方法:

如果你有足夠的訪問來改變index.php腳本,你可以做重寫,而不是在網絡服務器。這有一個好處,你有一個強大的語言在你的處置,這已經有很好的處理查詢字符串。

相關問題