错误文档和重写URL

Gui*_*ume 2 .htaccess http url-rewriting errordocument

我想使用自定义页面来解决一些HTTP错误,所以我使用.htaccess文件.同时我想使用URL重写,但这不起作用,我不知道为什么.

这是我的.htaccess:

#Rewrite options
RewriteEngine On    # Turn on the rewriting engine

#Error
RewriteRule    ^error/([0-9]{3})/?$    index.php?page=error-$1 [NC,L]

#Other options
ErrorDocument 403 error/403
ErrorDocument 404 error/404

<Files .htaccess>
order allow,deny
deny from all
</Files>

IndexIgnore *
Options All -Indexes
Run Code Online (Sandbox Code Playgroud)

SáT*_*SáT 8

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
Run Code Online (Sandbox Code Playgroud)

会给出一个非常好的行为:当我们请求例如找不到的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
Run Code Online (Sandbox Code Playgroud)