【问题标题】:mod_rewrite with URL in the query string查询字符串中带有 URL 的 mod_rewrite
【发布时间】: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&amp;url=example.com 重写为http://example.com/index.php?action=Controller/action&amp;url=example.com,这将按预期工作,$_GET 是:

Array
(
    [action] => Controller/action
    [url] => example.com
)

但是,我希望 $_GET['url'] 包含 http:// 和它自己的查询字符串,例如http://example.com/?a=1&amp;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(因此URLhttp:example.com?a=1&amp;b=2),其次是&amp;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...)。可选的查询字符串可以是任何东西,例如&amp;user_id=1&amp;api_key=1234&amp;optional_option_1=a&amp;optional_option_2=b&amp;url=....

因此,想象一下第三方访问,他们通过 URL 访问我们的网站(例如,http://example.com/Dashboard/view 带有他们选择的自定义参数(因此,如果他们使用 &amp;name=Michael&amp;age=25&amp;uihfwiu=alrjnwvur,它将显示:

姓名:迈克尔

年龄:25

uihfwiu:alrjnwvur

目前,唯一的问题是当值包含 /s 或 &amp;s 时——当它们不存在时它可以正常工作。

【问题讨论】:

  • 最简单的方法是使用以前有效的方法并在 http:// 前面加上 PHP $url = 'http://' . $_GET['url']; 我不会在重写方面投入太多,尤其是 URL 中的 URL,.. URL 初始。 http://example.com/Controller/action&amp;url=example.com 在第一个参数之前没有?

标签: php mod-rewrite


【解决方案1】:

经过长时间的讨论,事实证明 OP 使用了错误编码的 URL。正确编码的 URL 应该是:

/Controller/action&url=http%253A%252F%252Fexample.com%252F%253Fa%253D1%2526b%253D2&name=Michael&age=25

【讨论】:

  • 确实需要动态;它不会总是&amp;url——它可以是任何东西(或什么都不是)。
  • 对不起,当我的意思是它是动态的时,我的意思是我不能将 &amp;url=http://$2/?a=1&amp;b=2 指定为重写规则的一部分,因为我无法控制 URL(或任何其他参数)是什么被发送。它用于第三方访问。查询字符串可以是任何东西。唯一不变的是它以/ 分隔的单词列表开头(例如/Controller/action/param1/param2/param3...,后跟自定义查询字符串,例如&amp;user_id=1&amp;api_key=1234&amp;url=...
  • ok 和 &amp;url=http://$2/?a=1&amp;b=2 必须只为 &amp;url=something 完成,是否保留其他查询参数不变?
  • url 可能没有 ?a=1&amp;b=2 -- 它可能有任何东西。而不是url,键可能是a,或b,或c,或其他任何东西。
  • 但是我不清楚在什么条件下我们应该在查询字符串中按规则设置http://example.com/?a=1&amp;b=2
【解决方案2】:

好的,问题解决了。我需要?url= 而不是&amp;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>

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2015-06-09
    • 2011-03-28
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2012-05-11
    • 2016-12-12
    相关资源
    最近更新 更多