![](/img/trans.png)
[英]Mod_rewrite extract IP address from end of URL and pass to query string variable
[英]mod_rewrite: Pass the path & query string URL as a parameter
我正在使用mod_rewrite將漂亮的URL重寫為Spring 2.5應用程序支持的表單。
e.g. /category/cat1?q=x => /controller?category=cat1&q=x
但是,從我的控制器我想知道請求來自的原始URL(所以我可以生成鏈接,如果需要)。 所有頁面通常都需要這種方法,因此很難進行硬編碼。
如何從控制器訪問原始路徑+查詢字符串?
我嘗試使用$ 0來包含完整路徑,但這不包括查詢字符串。 我不能只追加路徑和查詢字符串,因為這會導致路徑的某些部分被添加為參數/category/cat1?category=cat1&q=x
注意添加了不需要的&category=cat1
參數,這會導致URL不再與瀏覽器發送的URL匹配。
我希望mod_rewrite允許我引用完整的URL並將其編碼為參數,因此我的規則可能如下所示:
RewriteRule /category/(.+)
/controller?category=$1&_originalUrl=${escape:$0}?${escape:<original query string>}
[QSA]
使用我的原始示例,最終結果傳遞給我的控制器將是:
/controller?category=cat1&_originalUrl=%2Fcategory%2Fcat1%3Fsearch%3Dx&search=x
重要的部分是&_originalUrl
的值,它應該是%2Fcategory%2Fcat1%3Fsearch%3Dx
,其非轉義版本是/category/cat1?q=x
(從瀏覽器發送的原始請求URL)。
歡迎任何建議,提前謝謝!
查詢可以使用RewriteCond
進行測試,因為RewriteRule
僅測試URL路徑 。 請參閱Jonathan Feinberg的示例,了解如何做到這一點。
但您也可以設置QSA標志 ,舊查詢會自動附加到新查詢:
RewriteRule ^/category/([^/]+)$ /controller?category=$1 [QSA]
編輯響應您對此問題的評論:如果要獲取初始請求的URI路徑和查詢,則需要從請求行 ( THE_REQUEST變量)中提取它:
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule ^/category/([^/]+)$ /controller?category=$1&_originalUrl=%1 [QSA]
但在大多數語言中,都有一個具有相同信息的環境變量。
您必須在初始的單獨步驟中捕獲查詢字符串。
RewriteCond %{query_string} ^q=([^&]+)
RewriteRule ^/category/(cat1)$ /controller?category=$1&q=%1
等等
你可以使用主機頭嗎? 抱歉這么模糊,但上次我不得不這樣做是使用PHP(urgh,不要問),我想我們是怎么做到的 - 例如REQUEST_URI( http://www.askapache.com/htaccess/mod_rewrite- variables-cheatsheet.html )
您也可以在重寫中設置主機頭( http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html )
例如:
ReWriteRule /category/(cat1)?q=(x) /controller?category=$1&q=$2 [E=FOO:....]
(不,我完全不是一個mod-rewrite ninja)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.