我想问一下关于Apache的这个mod_rewrite RewriteRule的基本说明,因为我找到了不同的解释,也许我遗漏了一些东西:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css)$ /index.php

当资源不是本地文件时,当请求的资源扩展名不是regexp的子模式中的硬编码之一时,该规则应该重写每个请求到index.php(在DOCUMENT_ROOT目录中),但是这个规则与这个规则有什么不同:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

?如果不是第二个规则(index.php)中的替换字符串是 without the leading slash ,它们就完全相同 .

现在,这里的用户 - > Apache rewrite rule leading slash说:

So /help.php looks in the root of the system for a file called help.php, which on my system it cannot find.

即使是/index.php(我发布的第一条规则中的替换字符串)也不应该这样吗?

然后我想问:如果请求是例如 http://localhost/a_file_that_don't_exist.php Apache将与a_file_that_don't_exist.php或/a_file_that_don't_exist.php匹配?

在维基 - > https://wiki.apache.org/httpd/RewriteRule,他们说Apache会:

匹配URI路径

那是:

http:// hostname之后的所有内容,不包括任何查询字符串参数

但是在一些关于RewriteRule的教程中,人们说URI路径是 http://hostname/ 之后的所有内容,因此不包括前导斜杠(没有前导斜杠的REQUEST_URI) .

有人可以解释这种误解吗?

如果模式匹配而没有前导斜杠,则第一个RewriteRule应该将URI路径替换为 - > http://localhost//index.php ,这不是有效的URL,而是两种方式都可以很好地工作...

编辑:在Apache文档中,他们说:

请注意,mod_rewrite会通过检查文件系统根目录中是否存在路径的第一个段来尝试猜测您是否指定了文件系统路径或URL路径 . 例如,如果您指定/www/file.html的替换字符串,那么这将被视为URL路径,除非在根或您的文件系统中存在名为www的目录(或者,在使用重写的情况下)在.htaccess文件中,相对于您的文档根目录),在这种情况下,它将被视为文件系统路径 .

因此,正确地说,在.htaccess中,如果没有前导斜杠,RewriteRules总是相对于DOCUMENT_ROOT,如果它们以前导斜杠开头并相对于.htaccess目录?