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
当 HTTPS
为 on
时,%1
反向引用包含 s
,否则为空。因此 PROTO
environment 变量设置为 http
或 https
.
这确实假定 SSL 由应用程序服务器而不是前端代理(如 Cloudflare Flexible SSL 等)管理。
我喜欢尽可能简化代码,但我不熟悉 .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
当 HTTPS
为 on
时,%1
反向引用包含 s
,否则为空。因此 PROTO
environment 变量设置为 http
或 https
.
这确实假定 SSL 由应用程序服务器而不是前端代理(如 Cloudflare Flexible SSL 等)管理。