首页 > 解决方案 > ErrorDocument 404 vs FallbackResource vs RewriteRule

问题描述

通过在没有真正了解发生了什么的情况下从网上“复制粘贴”,我制作了这样的 .htaccess 文件:

Options +FollowSymLinks -MultiViews -Indexes

ErrorDocument 404 /index.php?notfound=1  # (a)

FallbackResource /index.php?notfound=1  # (b)

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [NC,QSA,L]  # (c)

我觉得(a)和(b)指令没有用,因为(c)......我是对的吗?

这三个指令之间的真正区别是什么?

标签: apache.htaccessmod-rewriteerrordocument

解决方案


这三个指令之间的真正区别是什么?

他们都在这里或多或少地做同样的事情。

ErrorDocument 404并且FallbackResource都将给定的脚本设置为任何可能导致 404 的处理程序,因为请求的 URI 不会映射到任何现有文件或文件夹。

我认为这里的主要区别在于,ErrorDocument 404每次您仍然会在服务器的错误日志中获得一个条目,而FallbackResource这被认为暗示这是一个前端控制器,因此不会污染您的日志. 如果您需要有关实际404 发生情况的任何信息- 那么您必须在系统确定它实际上没有找到在请求的 URI 下提供的任何内容之后,自己从系统中记录它们。

重写版本基本上只是“老派”版本,文档FallbackResource明确提到,https ://httpd.apache.org/docs/2.4/mod/mod_dir.html#fallbackresource :

通常希望有一个文件或资源处理对特定目录的所有请求,但那些与现有文件或脚本相对应的请求除外。这通常被称为“前端控制器”。

在早期版本的 httpd 中,此效果通常需要 mod_rewrite,并使用-f-d测试文件和目录是否存在。这现在只需要一行配置。

因此,对于前两个中的任何一个,您甚至都不需要 mod_rewrite 可用(有时可能不是,在便宜的共享主机或其他东西上。)

如上所示的重写版本将在参数 name 下传递最初请求的 URI url,因此您可以使用$_GET['url']. 对于前两个中的任何一个,它都不会在新的内部重写 URL 中显式传递,因此您必须从服务器变量中访问它,如下面的几行所述,

后备处理程序(在上述情况下为 /blog/index.php)可以通过服务器变量访问原始请求的 URL REQUEST_URI。例如,要在 PHP 中访问此变量,请使用$_SERVER['REQUEST_URI'].

如果您不想将所有请求重写为同一个脚本,或者您不想在 PHP 中进行参数解析 - 就像您可能想要重写products/footoproducts.php?product=fooprofile/usernameto一样,使用 mod_rewrite 这样的事情仍然有它的用途profile.php?user=username

ErrorDocument 404并且FallbackResource特别不允许这样做,但是 mod_rewrite 具有与这些路径段特别匹配的不同规则集,但是可以做到这一点。

我想FallbackResource现在大多数人都认为 using 是最先进的,并且处理 URL 的解析并根据它决定接下来需要发生什么,通常被认为更合乎逻辑地放置在脚本部分站点/应用程序,而不是将其放在单独的位置,例如 .htaccess。


推荐阅读