簡體   English   中英

mod_rewrite:將路徑和查詢字符串URL作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM