2

我在 mod rewrite 方面遇到了一个小麻烦。我的一个朋友正在编写一个允许您上传图像的脚本。

我们想要做的是允许用户将域名附加到直接图像链接,并且脚本将从提供的 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。

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

谢谢你。

4

4 回答 4

3

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

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

作为参考,请参阅此 StackOverflow 线程:此错误报告

我正在发布我发现的内容,并将考虑回答这个问题。谢谢你们!

于 2012-05-03T23:32:23.410 回答
1

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

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

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

于 2012-05-03T22:42:48.613 回答
1

你可以在 php 中使用 urlencode()

于 2012-05-03T22:16:51.707 回答
0

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

尝试:

^((http|https)+[\:\/\/\w\.]+(jpg|png|gif))$
于 2012-05-03T22:22:59.847 回答