apache - 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)......我是对的吗?
这三个指令之间的真正区别是什么?
解决方案
这三个指令之间的真正区别是什么?
他们都在这里或多或少地做同样的事情。
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/foo
toproducts.php?product=foo
和profile/username
to一样,使用 mod_rewrite 这样的事情仍然有它的用途profile.php?user=username
。
ErrorDocument 404
并且FallbackResource
特别不允许这样做,但是 mod_rewrite 具有与这些路径段特别匹配的不同规则集,但是可以做到这一点。
我想FallbackResource
现在大多数人都认为 using 是最先进的,并且处理 URL 的解析并根据它决定接下来需要发生什么,通常被认为更合乎逻辑地放置在脚本部分站点/应用程序,而不是将其放在单独的位置,例如 .htaccess。
推荐阅读
- bootstrap-4 - Bootstrap 中的列问题
- matlab - 我可以在不产生子进程的情况下调试进程吗?
- azure - 如果 eventgrid 事件传递失败,设备是否会从 IoThub 收到错误消息?
- bash - 不同批次的zip目录
- flutter - 在 null 上调用了方法“[]”。- 无法从 firebase 实时数据库中检索
- python - Django 日志登录尝试并在 3 次尝试失败后锁定用户
- identityserver4 - Identity Server 登录请求代码质询
- javascript - 渲染组件,状态变量有多少对象(在 React.js 中)?
- multithreading - ActiveMQ CMS:有没有办法在不使用线程的情况下使用它?
- github - 将项目从 squeak smalltalk 上传到我的 github 帐户