在查询字符串中带有URL的mod_rewrite

时间:2014-01-09 10:07:57

标签: php mod-rewrite

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   这个服务器。

我的第一个假设是编码的/打破了重写规则,所以我删除了它们,修复了错误。然而,这会导致两个问题。主要是查询字符串中不再有/个(以便URLhttp: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或&时 - 它们在不存在时工作正常。

2 个答案:

答案 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>