最近在为 onepoint 项目添加阿里云盘子模块，发现上手有点晚了。最初有朋友在 github 上发过相关的 issue，因为一些原因一直没做。开始做的时候才发现，阿里云盘已经变”狡猾“了，设置了referrer 验证。要想解决这个问题，要先弄清楚 referrer 是什么referrer 是什么Referrer 是 HTTP 请求头里面包含的一个字段，内容是一个 URL，表示当前页面是通过这个 URL 里的链接进入的、或者当前资源是被这个 URL 引用的。因此服务器可以利用 referer(历史原因，拼写错误，后来就一直这样沿用了，下文统称为 referrer) 请求头字段来判断访问来源，获取用户浏览的历史记录。referrer 验证因为 referrer 的特点，有一些服务器会根据 referrer 的内容判断请求源是否源于自己的服务器，然后或接受或拒绝该请求。以阿里云的下载链接为例，通常情况下，如果是在阿里云盘的网站点击的这个链接，referrer 就是阿里云盘，如果是在本站打开的，那么referer 就是 https://www.onesrc.cn。阿里云也就可以根据这一点判断是否允许让用户下载文件，如下图所示。referrer 策略现在的浏览器已经可以支持对 referrer 发送情况进行控制，referrer 的默认策略如下：当访问一个网页里面包含的链接时，浏览器会自动加上 referrer 请求字段。但在以下两种情况下，referrer 不会被发送：来源页面采用的协议为表示本地文件的 "file" 或者 "data" URI；当前请求页面采用的是非安全协议，而来源页面采用的是安全协议（HTTPS）。除了默认策略，还可以通过 Referrer-Policy，对 referrer 的发送情况进行更精准的控制。Referrer-PolicyReferrer-Policy 有多种策略，其名称如下：Referrer-Policy: no-referrer Referrer-Policy: no-referrer-when-downgrade Referrer-Policy: origin Referrer-Policy: origin-when-cross-origin Referrer-Policy: same-origin Referrer-Policy: strict-origin Referrer-Policy: strict-origin-when-cross-origin Referrer-Policy: unsafe-urlno-referrer，无referrerno-referrer-when-downgrade，默认策略origin，仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。origin-when-cross-origin，对于同源的请求，会发送完整的URL作为引用地址，但是对于非同源请求仅发送文件的源。same-origin，对于同源请求会发送引用地址，但是对于非同源请求则不发送引用地址信息。strict-origin，在同等安全级别的情况下，发送文件的源作为引用地址(HTTPS->HTTPS)，但是在降级的情况下不会发送 (HTTPS->HTTP)。strict-origin-when-cross-origin，对于同源的请求，会发送完整的URL作为引用地址；在同等安全级别的情况下，发送文件的源作为引用地址(HTTPS->HTTPS)；在降级的情况下不发送此首部 (HTTPS->HTTP)。unsafe-url，无论是同源请求还是非同源请求，都发送完整的 URL（移除参数信息之后）作为引用地址。如何去除referrer 是因网页链接而产生的，换句话说，如果直接在浏览器中输入网址，就不会有 referrer 了，这是最简单的方式。另一种就是通过Referrer-Policy了HTML网页集成像 、 、 、 、 或者 这些都是可以包含一个链接的，如果需要对这里的 referrer 进行控制，可以通过 referrerpolicy 属性。例如： 还可以通过 meta 修改网页的默认策略：在 head 里面添加一个 referrer 策略 通过301、302除了网页集成，像 301、302 这样的跳转状态码，通常来说浏览器是不会再去获取响应体，因而响应头里面包含了这样一个字段Referrer-Policy，浏览器可以根据这个字段决定 referrer 的发送情况。例如 Referrer-Policy: same-origin。解决阿里防盗链防盗链一般都会允许空 referrer，否则在浏览器中单独输入这个链接就访问不了里面的内容了。阿里云盘也是如此，其策略是，referrer 可以没有，如果有，必须是俺们阿里家的。onepoint 的解决思路也很简单：对于网页预览时产生的 referrer，在 head 里面添加一个默认的同源策略。 对于下载时，302 跳转带的 referrer，通过在响应头里面添加一个 Referrer-Policy: same-origin 即可解决。例如：HTTP/1.1 302 Moved Temporarily Content-Type: text/html; charset=utf-8 Location: https://xxxxxx referrer-policy: same-origin参考链接https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policyhttps://stackoverflow.com/questions/55882899/how-not-to-loose-referer-value-on-301-https-redirects-in-Cloudflare-workershttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Refererhttps://www.zhihu.com/question/37101927附录附上一个可以查看 http 请求头的工具https://point.onesrc.cn/ip/
装了宝塔面板，服务器上的问题都交到宝塔上了，但是遇到了一个问题。本站是以www.onesrc.cn为主域名的，onesrc.cn 做成了301跳转。能实现onesrc.cn/xxx 到www.onesrc.cn的跳转，却无法跳转到www.onesrc.cn/xxx，百度后发现有在宝塔中这样设置301跳转的：设置之后，发现没毛用，$request_uri可以被nginx识别，但是不能被apache识别。木得办法了，干脆一不做二不休，弃用宝塔的301，自己手动写重定向规则。顺带着弃用了宝塔自带的强制https跳转，把这个也整合到apache的重定向里面打开url重定向支持找到 /www/server/apache/conf/httpd.conf文件，在第152行左右找到#LoadModule rewrite_module modules/mod_rewrite.so去掉代表注释的#号找到 < Directory >段，修改为 AllowOverride All AllowOverride All Require all granted 重启apache服务设置重定向规则在网站根目录下放一个.htaccess文件，内容如下 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^onesrc.cn$ [NC] RewriteRule ^(.*)$ https://www.onesrc.cn/$1 [R=301,L] RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.onesrc.cn/$1 [R=301,L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] 共有四条RewriteRule重定向规则将onesrc.cn的请求301重定向到 https://www.onesrc.cn 实现整站的301跳转将http请求(80端口) 重定向到 https://www.onesrc.cn 实现http至 https 跳转限制访问，不允许直接访问index.php文件当请求不存在的资源时, 统一重定向到index.php，由其（typecho）做出进一步处理参考：Apache Rewrite详细配置与使用说明apache如何设置http自动跳转到https如何将apache 变量request_uri作为参数传到页面