2013-04-08 37 views
0

說我想http://domain.com/product/?id=123成爲http://domain.com/product/foo,我該怎麼做在.htaccess?我試過這樣的東西,但它不起作用:查詢字符串的國防部重寫

RewriteCond %{QUERY_STRING} ^id=123$ [NC] 
RewriteRule ^/product$ /product/foo [NC,L,R=301] 

建議?

注意:我不需要捕獲id參數的值,因爲我不會在新URL中使用它。

更新1:

RewriteEngine On 
RewriteBase /fisher 

RewriteCond %{QUERY_STRING} ^id=123 [NC] 
RewriteRule ^product/$ /product/foo [NC,L,R=301] 
  1. 顯示RewriteEngine敘述和RewriteBase
  2. 中的RewriteCond刪除$
  3. 在重寫規則

刪除/當我去http://localhost/fisher/product/?id=123,沒有任何反應。該URL保持不變。

+0

嘗試獲得你的重寫規則模式的開始去掉正斜槓的。路徑不以.htaccess文件中的正斜槓開頭,因爲.htaccess文件是針對它們所在的目錄執行的。 (請注意,RewriteRule路徑確實以httpd.conf文件中的正斜槓開頭。) – Bobulous 2013-04-08 22:15:48

+0

更新了我的問題。 – snoopy76 2013-04-08 22:51:03

回答

0

清除瀏覽器緩存,並重啓瀏覽器,然後嘗試這個辦法:

Options +FollowSymLinks -MultiViews 
RewriteEngine On 
RewriteBase /fisher 

RewriteCond %{QUERY_STRING} ^id=123 [NC] 
RewriteRule ^product/?$ product/foo? [NC,L,R=302] 

一旦你驗證它是否工作正常,然後更改R=302R=301

+0

您能否詳細說明您的解決方案?請記住,'id = 123'可能會重定向到'product/foo',而'id = 999'可能會重定向到'product/bar'。 – snoopy76 2013-04-08 22:06:18

+0

進行了編輯,使其僅針對'id = 123'。我使用了一個mod_rewrite變量'%{THE_REQUEST}',它代表了Apache Web服務器從瀏覽器接收到的原始HTTP請求。 – anubhava 2013-04-08 22:09:26

+0

爲什麼不使用'QUERY_STRING'?另外,我嘗試了你的條件/規則,並去了'http:// localhost/fisher/product /?id = 123'。什麼都沒發生。它沒有改變我的網址。 – snoopy76 2013-04-08 22:15:49

0

http://localhost/fisher/product/?id=123

以上面的網址爲請求示例,您可以在/fisher目錄中的.htacces文件中嘗試此操作:

Options +FollowSymlinks -MultiViews 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_URI} ^/fisher/product/? [NC] 
RewriteCond %{QUERY_STRING} id=123   [NC] 
RewriteCond %{REQUEST_URI} !/foo   [NC] 
RewriteRule .*  /fisher/product/foo?  [R=301,L,NC] 

對於內部和無聲映射,替換[R = 301,L,NC]與[L,NC]

+0

我其實沒有「fisher」目錄。我使用的是CodeIgniter,它將每個控制器文件映射到一個URI段。這會改變什麼嗎? – snoopy76 2013-04-09 20:29:07

+0

我想,應有盡有。你可以發佈一個URL的例子,其目錄結構與真實的類似,可以修改答案嗎? – 2013-04-09 20:33:47