【问题标题】:Proper regex for .htaccess redirect and prevention of hotlinks.htaccess 重定向和防止热链接的正确正则表达式
【发布时间】:2019-02-19 12:31:09
【问题描述】:

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

我一直在努力学习正则表达式,但我仍然很讨厌它们。我很难掌握模式匹配。我精通其他 OOP 语言,所以我想我会学习正则表达式,但它只是逃避了我。

我已经下载了 EditPad Pro,所以我可以按照http://www.regular-expressions.info/tutorial.html 的建议进行练习。我可以获得匹配批量文本的表达式,但我正在尝试解析 URL,但我一直在丢失。

这就是我想要做的。我正在编写自己的永久链接 .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

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

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-_.]+
([^/]+)/?$
然后做好'ol子串和检查。它把它砍死了,我应该做得更好!

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

感谢您发送给我的任何帮助!

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

【问题讨论】:

标签: regex .htaccess mod-rewrite apache2


【解决方案1】:

我需要 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 引用 [原文如此] 不是以http://www.domain.com/https://domain.com/ 或 2 的任何组合。如果所有这些都为真,则它将请求重写到 /some_dir/som_subdir/some_file.php 文件,并将原始 URI 作为 querystring 参数。

【讨论】:

  • 你先生是人中的神!感谢您的快速响应,更重要的是,解释它。我现在正在检查这一切。一个问题,我可以根据需要添加尽可能多的这些: RewriteCond %{REQUEST_URI} !^/some_dir/ 因为有多个,还是我只是告诉它忽略除 image_dir 之外的所有目录?
  • @user1666691 您可以添加任意数量的RewriteCond,只需注意它们仅适用于RewriteRule 之后的立即。至于要排除的多个请求 URI,这取决于您是要排除还是包含,如果它可以满足您的需要,除了可读性之外并没有太大的缺点。
  • @user1666691 重写引擎不断循环遍历所有规则,一遍又一遍,直到进入引擎的 URI 与从引擎中出来的 URI 相同。您必须确保一旦 URI 被重写,它就不会再次匹配相同(或另一个)规则,从而导致循环,并且 apache 将返回 500 错误。我不知道你在这里具体想做什么。
  • 我的问题是也有合法的子目录:domain.com/admin(如果需要,我们可以直接调用 domain.com/admin/index.php)。这些不应该被应用,这就是我想将它们隔离出来的原因。
  • @user1666691 你应该发布一个新问题并包含你的规则,这是不可能通过 cmets 做到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多