我在使用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。
您能否告诉我此规则有什么问题以及如何解决?或者任何其他解决方案来实现我们想要的行为?
谢谢。
答案 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))$