不包括特定 URL 的热链接保护



我们尝试添加以下热链接保护以节省带宽。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://(www.)?domain [NC]
RewriteCond %{HTTP_REFERER} !^https://(www.)?domain.*$ [NC]
RewriteRule .(gif|GIF|jpg|JPG|PNG|png|jpeg|JPEG|mp4|MP4|mkv|MKV|webm|WEBM|ico|ICO)$ - [F]

这工作得很好。现在,我们希望排除 URL admin/thumbs (domain.tld/admin/thumbs/image.jpg) 的热链接保护,应从热链接保护中排除。

我们尝试添加以下代码,但它不起作用。我们搜索了stackoverflow和多个论坛,但没有一个帮助我们。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https://(www.)?domain [NC]
RewriteCond %{HTTP_REFERER} !^https://(www.)?domain.*$ [NC]
RewriteCond %{REQUEST_URI} !/admin/thumbs$
RewriteRule .(gif|GIF|jpg|JPG|PNG|png|jpeg|JPEG|mp4|MP4|mkv|MKV|webm|WEBM|ico|ICO)$ - [F]

任何帮助将不胜感激。

RewriteCond %{REQUEST_URI} !/admin/thumbs$

这会为任何/admin/thumbs结尾的 URL 创建一个例外,而您似乎想为/admin/thumbs子中的任何文件创建一个例外,即。 任何/admin/thumbs开头的 URL。

注释中!^admin/thumbs/?的建议不正确,因为REQUEST_URI服务器变量始终以斜杠开头,因此条件将始终成功,并且请求可能会被阻止。

您应该使用CondPattern!^/admin/thumbs($|/)来排除对/admin/thumbs/admin/thumbs//admin/thumbs/<anything>的请求,而不是/admin/thumbsomething请求。例如:

RewriteCond %{REQUEST_URI} !^/admin/thumbs($|/)

您现有的规则可以进一步简化/完善,因为检查HTTP_REFERER的现有条件是"相同的",但也匹配太多。混合大小写RewriteRule模式可以通过使用NC(nocase) 标志来展平

例如,完整的规则将变为:

# Hotlink protection for images, except those in "/admin/thumbs/..."
RewriteCond %{HTTP_REFERER} !^https://(www.)?example.com($|/) [NC]
RewriteCond %{REQUEST_URI} !^/admin/thumbs($|/)
RewriteRule .(gif|jpg|png|jpeg|mp4|mkv|webm|ico)$ - [NC,F]

请注意,这还会阻止Referer标头。这包括直接请求(直接在浏览器的地址栏中键入 URL 的任何人)和在其浏览器中禁止Referer的任何用户(某些用户这样做是为了增加隐私)。


带有附加.htaccess文件的替代解决方案

或者,您可以在/admin/thumbs/子目录中创建一个附加.htaccess,然后简单地禁用重写引擎。例如:

RewriteEngine Off

这将覆盖并防止在请求此子目录中的任何内容时处理父配置中的热链接保护指令。

最新更新