簡單的mod_rewrite我試圖改寫搜索查詢字符串
/search?keyword=foobar
到
/search/foobar
但沒有成功。
我現在有這似乎產生404以下:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
簡單的mod_rewrite我試圖改寫搜索查詢字符串
/search?keyword=foobar
到
/search/foobar
但沒有成功。
我現在有這似乎產生404以下:
RewriteCond %{QUERY_STRING} ^keyword=(.*)$ [NC]
RewriteRule .* /search/%1? [L,R=301]
除非你在/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]
我整理出來有以下:
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
它似乎仍然產生404儘管301似乎工作正常。 –