尝试从另一个网站打开网站上的网页时禁止 403

403 forbidden while trying to open a webpage on a website from another website

我在 Gitlab 页面上托管了一个静态网页。网页的URL为myname.gitlab.io

我有另一个网站由 hostgator 托管,其中有 URL "mysecondwebsite.com""mysecondwebsite.com""mysecondwebsite.com/charts/folder1/1.html""mysecondwebsite.com/charts/folder1/2.html""mysecondwebsite.com/charts/folder1/3.html" 等各种路径上托管了数千个静态 html 页面。

我不希望 "mysecondwebsite.com" 可以直接访问,也不想访问其中的页面。因此,我启用了按预期工作的热链接保护。现在,我还想允许访问 "mysecondwebsite.com" ONLY FROM myname.gitlab.io。该网站有超链接列表,单击这些超链接会在 "mysecondwebsite.com" 中打开一个适当的页面。为此,我在 hostgator 上的 .htaccess 文件中输入了以下内容,但没有帮助。我看到 403 禁止

# IP to allow
order allow,deny
deny from all
allow from gitlab.io

当前防盗链设置-

# DO NOT REMOVE THIS LINE AND THE LINES BELOW HOTLINKID:r2xGl7fjrh
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mysecondwebsite.com/.*$      [NC]
RewriteRule .*\.(.*|jpg|jpeg|gif|png|bmp|tiff|avi|mpeg|mpg|wma|mov|zip|rar|exe|mp3|pdf|swf|psd|txt|html|htm|php)$ https://mysecondwebsite.com [R,NC]
# DO NOT REMOVE THIS LINE AND THE LINES ABOVE r2xGl7fjrh:HOTLINKID

我绝不是网络托管方面的专家。请给我一些帮助来使它正常工作。

UDPATED htaccess

Options All -Indexes

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://((myfirstwebsite\.com)|((www\.)?mysecondwebsite\.com))/ [NC]
RewriteRule .* - [F]

HTTP LIVE HEADER DUMP

https://mysecondwebsite.com/charts/thisfolder/thisfile.html
Host: mysecondwebsite.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Alt-Used: mysecondwebsite.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1

GET: HTTP/2.0 403 Forbidden
cache-control: private, no-cache, no-store, must-revalidate, max-age=0
pragma: no-cache
content-type: text/html
content-length: 699
date: Wed, 06 Apr 2022 07:13:17 GMT
server: LiteSpeed
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"
X-Firefox-Spdy: h2
---------------------
https://mysecondwebsite.com/favicon.ico
Host: mysecondwebsite.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Alt-Used: mysecondwebsite.com
Connection: keep-alive
Referer: https://mysecondwebsite.com/charts/thisfolder/thisfile.html
Sec-Fetch-Dest: image
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-origin

GET: HTTP/3.0 404 Not Found
content-type: text/html
last-modified: Mon, 28 Mar 2022 13:48:20 GMT
etag: "999-6241bca4-dfd29bee5117e228;br"
accept-ranges: bytes
content-encoding: br
vary: Accept-Encoding
content-length: 911
date: Mon, 04 Apr 2022 10:11:14 GMT
server: LiteSpeed
content-security-policy: upgrade-insecure-requests
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"
X-Firefox-Http3: h3
---------------------

allow from gitlab.io 对 http referer header 不起作用,就像您所期望的那样。相反,它基于发出请求的用户的 IP 地址工作。

相反,您想使用某些东西来检查引荐来源网址,并在 包含 myname.gitlab.io 或您自己网站的主机名时拒绝访问。您可以通过在 .htaccess 文件中放置以下内容来使用 mod_rewrite 做到这一点:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://((myname\.gitlab\.io)|((www\.)?mysecondwebsite\.com))/ [NC]
RewriteRule .* - [F]

这将允许来自您的 gitlab 站点的引荐来源网址,然后将允许这些页面获取更多资源,例如图像、js 和 css。在这条规则中:

  • RewriteEngine on - 打开重写,这需要在您的 .htaccess 中指定一次,并在所有重写规则和条件之间共享
  • RewriteCond - 指定下一个重写规则的条件
  • !表示下面的正则表达式应该取反(不匹配)
  • ^是正则表达式的开头
  • NC 是“不区分大小写”,这意味着该规则不区分大小写,并且适用于 upper-case 和 lower-case 输入
  • RewriteRule 是实际规则
  • .* 表示它匹配所有 URL(在这种情况下,上面指定的条件很重要)
  • -表示没有目的地URL
  • F 表示它应该显示“禁止”状态,而不是重定向或在内部更改 URL.

这种方法的问题是它会禁止一些实际上是从 gitlab 引用的请求。并非所有浏览器实际上在所有情况下都发送引用 header。

Please could you share what the exception rule script is that you're thinking?

这只是@StephenOstermiller 出色回答的替代方案...

您可以改为保持现有的“热链接保护”脚本不变,该脚本由您的控制面板 GUI 生成(并根据需要通过 GUI 进行任何更改)。但是在 之前 您的热链接保护包括一个额外的规则,以便为您需要授予访问权限的任何域设置例外。

# Abort early if request is coming from an "allowed" domain
RewriteCond %{HTTP_REFERER} ^https://myname\.gitlab\.io($|/)
RewriteRule ^ - [L]

# Normal hotlink-protection follows...

这可以防止当请求来自允许的域时处理热链接保护。所以允许访问。

这确实假定您没有其他应按照此规则处理的指令。