【问题标题】:Mod Rewrite and passing a URL as parameterMod重写并将URL作为参数传递
【发布时间】:2012-05-13 11:30:53
【问题描述】:

我在修改 mod 时遇到了一点小麻烦。我的一个朋友正在编写一个允许您上传图片的脚本。

我们想要做的是允许用户将域名附加到直接图像链接,脚本将从提供的 URL 中检索图像。

例如,如果图像位于:http://www.test.com/image.jpg,添加 domain.com/http://www.test.com/image.jpg 将允许脚本检索该 url ( test.com) 来获取我们想要的图像。

编辑: HTTP 在 URL 前面,因为我不希望用户必须手动删除 HTTP。他们在浏览器中看到一张图片,在其前面附加“domain.com”、http 和 all,然后脚本检索该图片并将其存储在我们的服务器上。

我使用的规则是:

RewriteRule ^([\w|.|/]+(jpg|png|gif))$ /upload.php?url=http://$1 [B,L,NC,R=302]

这与 URL 正确匹配,但 http:// 中的冒号会导致问题。

如果用户输入:domain.com/www.test.com/image.jpg,它可以工作。

如果用户输入:domain.com/http://www.test.com/image.jpg,它不起作用,我得到一个 403 禁止页面(Windows 上的 XAMPP)。

如果用户输入:domain.com/http//www.test.com/image.jpg,它可以工作(http 中没有冒号)。

编辑:通过工作,我的意思是如果我在本地测试它,我可以看到我正确传递 $_GET['url'] 参数的 URL,而不是看到错误 403。

您能告诉我这条规则有什么问题以及如何解决吗?或者任何替代解决方案来实现我们想要的行为?

谢谢。

【问题讨论】:

  • 为什么规则右侧还需要http://works 是什么意思?
  • 我会编辑这个问题,让它变得更清楚。对不起!
  • 在您的虚拟服务器的 apache 配置中,您应该能够设置一个 mod_rewrite 日志文件并告诉 apache 在访问 Web 服务 URL 时记录所有内容。我怀疑错误可能不在您认为的位置。您正在使用的 apache 版本的 Google RewriteLog 指令。
  • 有趣。当我启用 mod_rewrite 日志记录并且冒号存在时,没有任何内容写入日志。我假设它没有被触发?当我删除冒号时,我会在日志中看到条目。
  • 这听起来很可疑,好像正在发生一些有趣的事情。将 RewriteLogLevel 提升到 9,看看会发生什么。

标签: php mod-rewrite url-rewriting


【解决方案1】:

嗯,我想我找到了问题所在。它不是正则表达式,也不是 mod_rewrite 本身。

所以这是 Windows 上的 Apache 中的一个错误,已被声明为 WONTFIX。

有关参考,请参阅this StackOverflow thread:this bug report

我将发布我发现的内容,并将认为此问题已得到解答。谢谢大家!

【讨论】:

    【解决方案2】:

    你可以在 php 中使用 urlencode()

    【讨论】:

      【解决方案3】:

      这种方法很麻烦、容易出错且不安全(例如,图像 URL 不需要以那些众所周知的文件扩展名结尾)

      如果我了解您的用例,它会在用户在网上冲浪并查看图像并希望通过您的服务共享图像时开始。然后他在浏览器的地址栏中手动输入http://your.sharing.service,就在任何文本之前。然后您使用mod_rewrite 触发您的脚本,但我认为您的正则表达式(以及您的服务)将以多种不可预知的方式失败。

      我从未使用过这样的服务,我认为应该首选使用按钮将 URL 提交到某个脚本(比如http://my.service.com/upload?url=...)的标准方法。

      【讨论】:

      • 这就是我想做的。灵感实际上来自reddit。如果您遇到想要分享的页面,您只需在页面的 URL 前附加“reddit.com/”,它会将您带到允许您分享页面的页面。我想做类似的事情,但只是为了图像。至于扩展,它只是为了测试目的。我们只接受简单的图片,不要太复杂。
      • 是的,但是有比使用正则表达式更好的方法。例如,将各种 URL 重定向到你的脚本,让它在本地下载资源并执行一些虚拟函数来判断它是否是一个有效的图像文件
      • 你的意思是一种控制器脚本?但是,如果要重定向的 URL 中有冒号,重定向就会中断,我该如何将各种 URL 重定向到它。那不还是个问题吗?有没有办法在不重写 mod 的情况下重定向 URL?
      • 顺便说一句,Reddit 适用于网页。通常,站点不会将原始图像二进制数据输出到浏览器,而是使用 html 文档进行响应。我不认为在浏览器栏中有一个图像 URL 很常见(我想到的唯一情况是 4chan)
      • 我们希望用户在直接链接到图像之前附加我们的域,例如URL 直接以图像扩展名结尾。 URL 本身将转到一个脚本,该脚本将检查链接是否实际上是图像。那没问题。首先,冒号必须起作用!
      【解决方案4】:

      问题出在你的正则表达式中......

      试试:

      ^((http|https)+[\:\/\/\w\.]+(jpg|png|gif))$
      

      【讨论】:

      • 还是一样。我收到 403 禁止错误。 “您无权访问所请求的对象。它要么受读保护,要么服务器不可读。”
      • @Inf.S 尝试:/upload.php?url=$1
      • 规则为:RewriteRule ^((http|https)+[\:\/\/\w\.]+(jpg|png|gif))$ /upload.php?url=$1 [B,L,NC,R=302] 仍然是 403。如果我删除 :.,它会再次起作用。
      • @Inf.S 好的(我在这里在黑暗中拍摄):试试吧:[R=302]。或者甚至只是为了测试而删除所有标志。
      • 请查看我在有关日志记录的主要问题中的评论。如果冒号在那里,就好像 mod-rewrite 不会触发。
      猜你喜欢
      • 1970-01-01
      • 2014-11-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多