当mod_rewrite
是查询字符串的一部分时,URL
遇到了一些问题。
我目前的重写规则是:
<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
:
http://example.com/Controller/action&url=http%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2
然而,这会产生Apache
错误:
未找到
未找到请求的网址/控制器/操作&amp; url = http://example.com/?a=1&b=2 这个服务器。
我的第一个假设是编码的/
打破了重写规则,所以我删除了它们,修复了错误。然而,这会导致两个问题。主要是查询字符串中不再有/
个(以便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=...
。
想象一下第三方访问权限,他们通过网址访问我们的网站(例如http://example.com/Dashboard/view使用他们选择的自定义参数(因此,如果他们使用&name=Michael&age=25&uihfwiu=alrjnwvur
,则会显示:
名称:迈克尔
年龄:25
uihfwiu :alrjnwvur
目前,唯一的问题是当值包含/
s或&
时 - 它们在不存在时工作正常。
答案 0 :(得分:1)
经过长时间的讨论,结果发现OP使用了错误编码的URL。正确编码的URL应为:
/Controller/action&url=http%253A%252F%252Fexample.com%252F%253Fa%253D1%2526b%253D2&name=Michael&age=25
答案 1 :(得分:0)
&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>