我让 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]
如果您获取一个空的referer
URL 参数,那是因为 HTTPReferer
为空(不存在)。
我有 htaccess 检测缺失的文件夹
请注意,您的指令是“检测缺失文件“ 也一样。
但是,正如 @HBruijn 在评论中指出的那样,为什么要“外部重定向”请求?似乎最好只是“内部重写”请求并避免第二个请求。在这种情况下,只需删除该R
标志即可。例如:
RewriteRule ^([^/]*)/?([^/]*)/?$ /page.html?a=$1&b=$2 [QSA,L]
但是,为什么不实现自定义 404 并完全避免 mod_rewrite 呢?