我在 .htaccess 文件中做了一些服务器配置。我写下没有图像可以公开访问的规则。但我想授权可以访问图像 URL 的子域。
:
注意:两个域都在同一个 public_html 目录中
您似乎需要子域的例外并阻止其他主机名?
有点猜测您目前是如何做到这一点的 - 也许是使用 mod_authz_core 和 <FilesMatch> 容器?还是使用 mod_rewrite?还是 Apache <If> 表达式??
您可以使用 mod_rewrite 执行以下操作,靠近根 .htaccess 文件的顶部,以阻止对所有图像的访问,除非通过子域访问。
RewriteEngine On
# Block (403 Forbidden) all image requests unless accessed through the subdomain
RewriteCond %{HTTP_HOST} !^subdomain\.example\.com
RewriteRule \.(jpe?g|png|webp|gif)$ - [F]
现在,https://example.com/images/one.jpg 形式的请求将被阻止,但 https://subdomain.example.com/images/one.jpg 将可以访问。
我不想放一个完整的路径来从根域访问文件
但您需要使用绝对(或协议相对)URL 来访问 子域 中的文件。
更新:
我的父域“example.com”中的当前规则
RewriteCond %{HTTP_REFERER} !^https://example.com/ [NC]
RewriteRule \.(gif|jpg|jpeg|png|mp4|mov|mkv|flv|svg)$ - [F,L]
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
啊,你已经实现了一种盗链保护!在这种情况下,您似乎只需要修改第一个条件以允许来自子域的请求。例如:
RewriteCond %{HTTP_REFERER} !^https://(subdomain\.)?example.com/
允许来自example.com 和subdomain.example.com 的请求。 NC 标志应该被省略。所有浏览器都会将请求中的主机名小写。
“允许”访问不需要其他规则。您不需要使用绝对 URL 来访问这些资源 - 因为这似乎不是您要阻止的内容。您只需要能够从另一个主机(即子域)访问这些资源。
总结:
RewriteEngine On
# Hotlink protection
RewriteCond %{HTTP_REFERER} !^https://(subdomain\.)?example.com/
RewriteRule \.(gif|jpg|jpeg|png|mp4|mov|mkv|flv|svg)$ - [F]
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
L 标志不需要与 F 标志一起使用,因为它是隐含的。
^(.*)$ 是不必要的,因为没有使用反向引用。简单地拥有^ 就足够了,而且效率更高——无需实际匹配所有内容即可成功。