ErrorDocument 指令的参数可以是字符串、内部 URI 或外部 URI。您在此处拥有的“error/404”变体被解释为字符串,因此 Apache 只是将其输出,就好像它是硬编码的错误消息一样。这不是我们现在想要的。
现在,如果我们在它前面加上一个斜杠,“/error/404”将是一个本地重定向,但相对于 DocumentRoot 是本地的。因此,如果我们在http://example.com/testit/.htaccess有 .htaccess 文件,并且我们请求http://example.com/testit/something.txt,则文档http://example.com/error /404将被加载。为避免这种情况,只需在它前面加上子目录的路径( /testit/error/404 ),或者以其他方式使用 DocumentRoot。但是,请注意,它已经是软重定向:浏览器的地址栏会显示用户输入的 URI,因此无需让 ErrorDocument 的 URI 变得漂亮。只是
ErrorDocument 404 /path-to-my-folder/index.php?page=error-404
将给出一个非常好的行为:当我们请求未找到的 example.com/something.txt 时,地址栏将继续显示 example.com/something.txt,而 index.php?page= 的内容将提供错误 404。
但是,如果你真的想在浏览器的地址栏中显示 /error/404,请给 ErrorDocument 一个绝对 URI 作为参数,例如ErrorDocument 404 http://my-server/my-path/error/404
这将强制浏览器硬重定向到该文档;请求会被 mod_rewrite 规则捕获,并提供 index.php?page=error-404 的内容,而地址栏将继续显示 /error/404。这种方法的缺点是您必须手动设置 404 响应标头,并且您不知道原始请求是什么。它也可能会迷惑机器人,也会迷惑游客,因为这不是他们所期望的行为。
我的建议是,只需将其设为相对链接,如下所示:
#Rewrite options
RewriteEngine On # Turn on the rewriting engine
#Other options
ErrorDocument 403 /path-to-my-subfolder/index.php?page=error-403
ErrorDocument 404 /path-to-my-subfolder/index.php?page=error-404
IndexIgnore *
Options All -Indexes