[英]mod_rewrite with URL in the query string
URL
是查詢字符串的一部分時,我在使用mod_rewrite
時遇到一些困難。
我當前的重寫規則是:
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?action=$1 [L]
</IfModule>
這會將http://example.com/Controller/action&url=example.com
重寫為http://example.com/index.php?action=Controller/action&url=example.com
,按預期方式運行,其中$_GET
為:
Array
(
[action] => Controller/action
[url] => example.com
)
但是,我希望$_GET['url']
包含http://
和它自己的查詢字符串,例如http://example.com/?a=1&b=2
,以便$_GET
為:
Array
(
[action] => Controller/action
[url] => http://example.com/?a=1&b=2
)
我首先嘗試使用rawurlencode
對(查詢字符串) URL
進行rawurlencode
:
http://example.com/Controller/action&url=http%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2
但是,這會導致Apache
錯誤:
未找到
在此服務器上找不到請求的URL / Controller / action&url = http://example.com/?a=1&b=2 。
我的第一個假設是已編碼的/
s違反了重寫規則,因此我將其刪除,從而修復了錯誤。 但是,這引起兩個問題。 主要的原因是查詢字符串中不再有任何/
s(因此URL
為http:example.com?a=1&b=2
),第二個原因是對&
進行了字面處理,並給出了$_GET
值:
Array
(
[action] => Controller/action
[url] => http:example.com?a=1
[b] => 2
)
如果有人知道如何解決這些問題,我將不勝感激。
澄清
值得指出的是,不管使用什么特定的查詢字符串,這都需要工作,例如$_GET
可以是:
Array
(
[action] => A/b/c/d
[href] => https://test.com/Test/test?test=test
[rhyme] => Jack & Jill
)
唯一的常數是它以/
分隔的單詞列表開頭(例如/Controller/action/param1/param2/param3...
)。 可選查詢字符串可以是任何值,例如&user_id=1&api_key=1234&optional_option_1=a&optional_option_2=b&url=...
因此,想象一下第三方訪問通過URL(例如, http : //example.com/Dashboard/view,帶有他們選擇的自定義參數)訪問我們的網站的情況(因此,如果他們使用&name=Michael&age=25&uihfwiu=alrjnwvur
,它將顯示:
名字 :邁克爾
年齡 :25
uihfwiu :alrjnwvur
當前,唯一的問題是值包含/
s或&
s時-不存在時按原樣可以正常工作。
經過長時間的討論,結果發現OP使用了錯誤編碼的URL。 正確編碼的URL應該是:
/Controller/action&url=http%253A%252F%252Fexample.com%252F%253Fa%253D1%2526b%253D2&name=Michael&age=25
好,問題解決了。 而不是&url=
我需要?url=
,而mod_rewrite
需要QSA
標志:
http://example.com/Controller/action?url=http%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?action=$1 [L,QSA]
</IfModule>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.