使用 301 重定向时保留 HTTP referer

使用 301 重定向时保留 HTTP referer

我让 htaccess 检测缺失的文件夹,然后通过 301 重定向将用户发送到另一个页面。

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 


RewriteRule ^([^/]*)/?([^/]*)/?$ /page.html?a=$1&b=$2 [QSA,L,R=301]

问题是我需要在 page.html 上记录 HTTP_REFERER,但是这会因 301 而丢失。如果没有 301,该值也会丢失。

Apache 可以使用 %{HTTP_REFERER} 访问 HTTP_REFERER,但这似乎只能由条件规则访问,而不能由重写访问。因此,我无法按照自己的意愿将 %{HTTP_REFERER} 值附加到 URL 中。

据我所知,这里没有简单的解决方案,所以我想知道是否还有其他方法来解决这个问题。

答案1

但 301 却忽略了这一点

普通的 3xx 重定向将保留 HTTP Referer。但是,HTTP Referer 是否存在完全取决于发出请求的客户端。如果 HTTP Referer 不存在,则是因为客户端未发送它。如果 HTTP Referer 不存在于重定向请求中,那么它可能也不存在于初始请求中。

请注意,客户端发送的 HTTP Referer 可能会受到Referrer-Policy在源站点上实现。

所以我无法在 URL 中%{HTTP_REFERER}附加值

是的,你可以。例如:

RewriteRule ^([^/]*)/?([^/]*)/?$ /page.html?a=$1&b=$2&referer=%{HTTP_REFERER} [QSA,L,R=301]

如果您获取一个空的refererURL 参数,那是因为 HTTPReferer为空(不存在)。

我有 htaccess 检测缺失的文件夹

请注意,您的指令是“检测缺失文件“ 也一样。

但是,正如 @HBruijn 在评论中指出的那样,为什么要“外部重定向”请求?似乎最好只是“内部重写”请求并避免第二个请求。在这种情况下,只需删除该R标志即可。例如:

RewriteRule ^([^/]*)/?([^/]*)/?$ /page.html?a=$1&b=$2 [QSA,L]

但是,为什么不实现自定义 404 并完全避免 mod_rewrite 呢?

相关内容