正确的正则表达式.htaccess重定向和防止热链接

时间:2012-09-12 18:51:19

标签: regex .htaccess mod-rewrite apache2

我在Reddit上发布了这个(r / learnprogramming),有人告诉我,告诉我来这里,所以我来了!

我一直在努力学习正则表达式,我仍然嘲笑他们。我很难理解模式匹配。我在其他OOP语言中很扎实,所以我想我会学习正则表达式而且它只是躲避我。

我已下载了EditPad Pro,因此我可以按照http://www.regular-expressions.info/tutorial.html的建议练习。我可以使用表达式来匹配批量文本,但我正在尝试解析URL并且我一直在遗漏。

这是我想要做的。我正在编写自己的固定链接.htaccess文件作为概念验证研究,因此我希望在未来的网站中使用它。

我需要从网址返回以下动态内容:

我需要除http:// www.domain.com/或http:// domain.com/或domain.com /之外的所有内容:
(由于新帐户的限制,我在http://之后添加了一个空格)

http:// www.domain.com/asdjh324hj.jpg
http:// www.domain.com/asa45s.png
http:// www.domain.com/aser24hj.gif/
http:// www.domain.com/wer234dsfa/
http:// www.domain.com/k3kjk4
http:// www.domain.com/k3kasd4/
>

匹配的部分将附加到:

http:// www.domain.com/some_dir/som_subdir/some_file.php?querystring=$1

但是,我不希望结果中包含任何这些网址:

http:// www.domain.com/some_dir/some_file.php
http:// www.domain.com/some_dir/some_subdir/some_file.html

我需要阻止在image_dir中对图片进行热链接:

http:// www.domain.com/image_dir/some_dir/some_subdir/some_image.jpg(或png,gif等)

热链接的图片会被重定向到一个页面,并将传递的图片作为查询字符串。

那么我会设置RewriteRule正则表达式来抓住它?我理解RewriteRules和标志,将匹配的结果放入变量等等,我只是无法弄清楚我应该写什么正则表达式以获取实际结果。

如果这对于RewriteRules来说太复杂了,那么请告诉我,因为我在这里挣扎。

通常我会在PHP中执行这些操作并从以下开始:
的.com / [A-ZA-Z0-9 -_。] +
([^ /] +)/?$
然后做好的子串和检查。它正在把它砍死,我应该做得更好!

我目前正在阅读regular-expressions.info教程,并且正在取得进展,但我也一直在抓错。

感谢您提供任何帮助,我们可以发送!

更新:我能够通过大量帮助解决所有问题,并在此处进行了详细讨论:Mod_Rewrite conditions help for hotlinking but allow local requests

1 个答案:

答案 0 :(得分:0)

  

我需要http:// www.domain.com/或http:// domain.com/或domain.com/:

以外的所有内容
RewriteCond %{REQUEST_URI} !^/$
  

但是,我不希望结果中出现任何这些网址:

RewriteCond %{REQUEST_URI} !^/some_dir/
  

匹配的部分将附加到:

RewriteRule ^(.*)$ /some_dir/som_subdir/some_file.php?querystring=$1 [L]

所以它应该看起来像这样:

RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !^/some_dir/
RewriteRule ^(.*)$ /some_dir/som_subdir/some_file.php?querystring=$1 [L]

当您请求http://www.domain.com/asa45s.html之类的内容时,它将会在内部重写为some_dir/som_subdir/some_file.php?querystring=asa45s.html。至于热链接位:

RewriteCond %{REQUEST_URI} ^/image_dir/
RewriteCond %{REQUEST_URI} \.(png|gif|jpe?g|bmp|ico)$ [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?domain.com/
RewriteRule ^(.*)$ /some_dir/som_subdir/some_file.php?querystring=$1 [L]

这首先检查请求是针对/image_dir/目录中的某个内容,然后请求的资源以png / gif / jpeg / bmp / ico扩展名结尾,然后HTTP referer [sic]不会以http://www.domain.com/https://domain.com/或2的任意组合开头。如果所有这些都为真,则将请求重写为/some_dir/som_subdir/some_file.php文件,原始URI为querystring参数。