修改重写并将 URL 作为参数传递


Mod Rewrite and passing a URL as parameter

我在重写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。

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

谢谢。

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

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

有关参考,请参阅此 StackOverflow 线程:和此错误报告

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

你可以在 php 中使用 urlencode((

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

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

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

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

尝试:

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