2013-07-03 265 views
0

簡單的mod_rewrite我試圖改寫搜索查詢字符串

/search?keyword=foobar 

/search/foobar 

但沒有成功。

我現在有這似乎產生404以下:

RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC] 
RewriteRule .* /search/%1? [L,R=301] 

回答

0

除非你在/search/foobar有資源,那麼你當然會得到一個404兩個完全不同的事情發生在這裏。服務器擁有一個物理資源,可以被apache知道服務(或運行的腳本)。如果apache看到/search/foobar,它將查找名爲「search」的目錄以及名爲「foobar」的目錄或文件。如果它看不到,它將返回404。發生的另一部分是瀏覽器,與apache完全分離,會看到一個URL(例如/search/foobar),並執行它爲了請求資源而需要做的事情。它與網絡服務器通話,並要求/search/foobar

當請求進入時,取決於URL文件處理管道將其轉化爲指向資源位置的文件。如果mod_rewrite的取網址並重寫爲/blah/blah/blah,還有更好的是一個名爲/blah/blah目錄,並呼籲blah中有一個文件,否則它要404

你的規則是說,如果傳入的請求是與什麼查詢字符串?keyword=(something),然後將瀏覽器重定向到/search/(something)。瀏覽器看到這一點,並做它應該做的事情;它發送另一個請求/search/(something)。 Apache的要看到這一點,不知道該請求是關於什麼的,不知道的要求是什麼,並返回404

你可能想要的是第一個,處理/search/(something) URI的

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/?search/(.*)$ /search?keyword=$1 [L,QSA] 

所以當請求以/search/foobar的形式出現時,重寫引擎在內部將其重寫爲Apache可以理解的東西/search?keyword=foobar。這種內部重寫完全發生在服務器上,瀏覽器對此一無所知。

現在,當一個表單作爲GET方法提交時,您最終會在URL中輸入?keyword=(something),看起來您正試圖擺脫這種情況。所以apache獲取查詢字符串,並且必須有東西將瀏覽器重定向到更好看的URL,在這一點上瀏覽器做它的事情,提交一個全新的請求,由上述規則在內部重寫回到它應該是。

RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*) 
RewriteRule^/search/%1?%2 [L,R=301] 
+0

它似乎仍然產生404儘管301似乎工作正常。 –

0

我整理出來有以下:

RewriteRule search/(.*)$ /search?keyword=$1 [L] 
RewriteCond %{THE_REQUEST} \?keyword=([^\ &]+)&?([^\ ]*) 
RewriteRule^/search/%1?%2 [L,R=301] 

但並不完全。在存在多個查詢字符串或URL中包含search/的其他URL時出現問題,例如。 /search/css/foobar.css?version=152