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



我在Reddit(r/learnprogramming)上发布了这篇文章,那里有人叫我来这里,所以我来了!

我一直在尝试学习正则表达式,但我仍然很难掌握。我很难掌握模式匹配。我精通其他OOP语言,所以我想我会学习正则表达式,但它却回避了我。

我已经下载了EditPad Pro,所以我可以作为http://www.regular-expressions.info/tutorial.html建议。我可以获取与批量文本匹配的表达式,但我正在尝试解析URL,结果一直找不到。

这是我正在尝试做的。我正在写我自己的permalink.htaccess文件作为概念验证研究,所以我希望在未来的网站上使用它。

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

我需要除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

但是,我不想在结果中出现任何这些URL:

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/som_subdir/some_image.jpg(或png、gif等)

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

那么,我应该设置什么样的RewriteRule正则表达式来获取它呢?我了解RewriteRules和标志,将匹配的结果放入变量中,等等,我只是不知道应该写什么regex来获取实际结果。

如果这对RewriteRules来说太复杂了,那么请让我知道我在这里很挣扎。

通常我在PHP中执行这些操作,并以以下开头:
.com/[a-zA-Z0-9-_.]+
([^/]+)/$
然后执行好所有的子字符串和检查。它把它砍死了,我应该做得更好!

我目前正在学习常规的extressions.info教程,并取得了进展,但我也一直在抓错误的东西。

谢谢你给我的任何帮助!

更新:我在大量的帮助下解决了所有问题,并在这里讨论了更多内容:Mod_Rewrite条件有助于热链接,但允许本地请求

我需要除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的任何组合开头。如果所有这些都是真的,那么它会用原始URI作为querystring参数将请求重写到/some_dir/som_subdir/some_file.php文件中。

最新更新