Mod重写并传递URL作为参数

时间:2012-05-03 22:15:12

标签: php mod-rewrite url-rewriting

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

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

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

编辑: HTTP位于网址前面,因为我不希望用户必须手动删除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 个答案:

答案 0 :(得分:2)

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

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

如需参考,请参阅this StackOverflow thread:this bug report

我发布了我发现的内容,并会考虑回答这个问题。谢谢大家!

答案 1 :(得分:1)

你可以在php中使用urlencode()

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

问题在于你的正则表达式......

尝试:

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