【发布时间】:2014-01-09 10:07:57
【问题描述】:
当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:
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),其次是&s 被逐字处理,给出$_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 时——当它们不存在时它可以正常工作。
【问题讨论】:
-
最简单的方法是使用以前有效的方法并在
http://前面加上 PHP$url = 'http://' . $_GET['url'];我不会在重写方面投入太多,尤其是 URL 中的 URL,.. URL 初始。http://example.com/Controller/action&url=example.com在第一个参数之前没有?
标签: php mod-rewrite