【问题标题】:.htaccess - hotlink prevention not working for other hosted domains.htaccess - 防止热链接不适用于其他托管域
【发布时间】:2018-09-12 21:50:36
【问题描述】:

这可能是一个简单的解决方案,但我有一个托管帐户和一个与之关联的主域。我还在同一个帐户上“分托管”了其他域。我在文档根目录设置防盗链。但是,它仅适用于主域。子托管域继续允许盗链。

这是我正在使用的代码。可能需要进行哪些修改来防止同一主机上其他域的热链接?谢谢

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?PRIMARY-DOMAIN.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?SUB-HOST1.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?SUB-HOST2.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?SUB-HOST3.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://www.PRIMARY-DOMAIN.com/Images/Hotlink/hotlink.gif [NC,R,L]
RewriteCond %{REQUEST_URI} !^/Images/Hotlink/

【问题讨论】:

  • 您的子域的文档根目录是什么?它是否指向/subdomain 文件夹?
  • 在文档根目录下,子域指向同名文件夹。
  • 也许我需要在每个 /subdomain 文件夹中使用特定于站点的 .htaccess 规则?

标签: html .htaccess mod-rewrite http-referer hotlinking


【解决方案1】:

在文档根目录中,子域指向同名文件夹。

如果这些子目录也有它们自己的包含 mod_rewrite 指令的 .htaccess 文件,那么(默认情况下)这些指令将完全覆盖父 .htaccess 文件(在主域中)中的 mod_rewrite 指令。因此,您的“盗链”指令将永远不会得到处理。

您要么需要启用 mod_rewrite 继承。但是,如果您在父 .htaccess 文件中有其他指令,这可能会带来一些警告。并且取决于您是否拥有 Apache 2.2 或 2.4+

例如,在 Apache 2.4 上,您可以在父 .htaccess 文件中包含以下指令以处理“热链接”指令子域的 .htaccess 文件中的指令之前: p>

RewriteOptions InheritDownBefore

但请注意,这可能会破坏您的网站,具体取决于您在 .htaccess 文件中的其他指令。 mod_rewrite 继承通过就地复制指令来工作 - 如果您依赖目录前缀,这可能是一个问题。

或者,您在每个子目录/子域的.htaccess 文件中重现这些热链接指令。

RewriteRule \.(jpg|jpeg|png|gif)$ http://www.PRIMARY-DOMAIN.com/Images/Hotlink/hotlink.gif [NC,R,L]
RewriteCond %{REQUEST_URI} !^/Images/Hotlink/

这些指令是错误的。 RewriteRule 应该是最后一个。

【讨论】:

  • 澄清一下,子域文件夹没有自己的 .htaccess 文件。 $_SERVER['SERVER_SOFTWARE'] 仅返回“Apache”。不希望用 IneritDownBefore 破坏网站。最后,RewriteCond 旨在允许显示热链接图像 - 热链接图像的一个例外。
  • 在这种情况下,如果不查看服务器配置,不清楚为什么这不起作用。指令本身是“OK”的。但是,这可能取决于这些“子托管域”是如何实现的——例如,AllowOverride 可能已被限制为“子托管域”文档根目录。 “RewriteCond 旨在允许显示热链接图像” - 是的,我明白了。但是,RewriteCond 指令仍然需要在 RewriteRule 之前才能生效。
  • 我会联系我的主机,看看是否有任何限制可能阻止我使用 htaccess 热链接解决方案。
  • “htaccess hotlink解决方案”本身可能不是问题。能够从当前主机的 DocumentRoot 之上的父配置继承 mod_rewrite 指令更可能是问题所在。这很容易测试...使用SetEnv (mod_env) 和RewriteRule (mod_rewrite) 在父配置中设置一个环境变量 - 您在访问sub-host.com 时看到一个或另一个或两个?
  • 我给房东发了邮件。没有回音,但今天 - 他们都在工作。所以要么我所做的更改需要一些时间才能被服务器识别,要么他们在幕后进行了更改并且尚未向我解释。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2018-12-19
  • 2011-03-29
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多