Apache错误文件自动重写规则

Apache error Document automatic re-write rule

我喜欢尽可能简化代码,但我不熟悉 .htaccess,我有错误文档重定向规则硬编码

ErrorDocument 403 http://example.com/error/404

然后我成功了

ErrorDocument 403 http://%{HTTP_HOST}/error/404

我的问题是不必手动修改 .htaccess 有没有办法告诉它它是 https 还是 http?因为上面的例子如果我使用 https 生病必须硬编码 https 我想自动检查。

不要在 ErrorDocument 指令中使用绝对值 URL

ErrorDocument 403 http://example.com/error/404

您不应该在 ErrorDocument 指令中使用绝对 URL 作为开头!这将触发对目标 URL 的 302 响应(即 302 临时重定向)。因此,这不会在第一次响应时将 403(或 404)响应发送回用户代理。

ErrorDocument 指令的这种格式只应在非常特殊的情况下使用,因为您还会丢失大量有关首先触发响应的 URL 的信息。)

要在同一台服务器上内部提供自定义错误文档,这应该是相对于 root 的 URL,以斜线开头(无方案或主机名)。例如:

ErrorDocument 403 /error/404

但是,/error/404 不太可能是有效的终点。这应该表示可以提供的有效资源。例如。 /error/404.html.

(这自然就解决了必须指定 HTTP 还是 HTTPS 的问题。)


回答您的具体问题...

because the above example if i use https ill have to hard code https

(尽管可以说,这些天你应该到处都是 HTTPS。)

但是,要执行您要求的操作,您可以使用 REQUEST_SCHEME server 变量执行类似以下操作,例如:

ErrorDocument 403 %{REQUEST_SCHEME}://%{HTTP_HOST}/error/404

或者,如果 REQUEST_SCHEME 服务器变量不可用,那么您可以使用 mod_rewrite 从 HTTPS 服务器变量构造它,并将其分配给 环境 变量。例如:

RewriteEngine On
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ - [E=PROTO:http%1]

ErrorDocument 403 %{reqenv:PROTO}://%{HTTP_HOST}/error/404

HTTPSon 时,%1 反向引用包含 s,否则为空。因此 PROTO environment 变量设置为 httphttps.

这确实假定 SSL 由应用程序服务器而不是前端代理(如 Cloudflare Flexible SSL 等)管理。