1

鉴于以下条件和规则,mod_rewrite 如何验证请求是文件还是目录?

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

我的解释是,如果请求不是文件而不是目录则处理具有模式的重写规则任何不是问号的字符,用反向引用替换为查询字符串$1

不是每个请求都是一个文件或目录,例如 index.php、style.css、media 等吗?条件不应该是

    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

如果请求是文件目录,则会读取,然后处理重写规则

4

1 回答 1

0

根据mod_rewrite 文档 REQUEST_FILENAME是:

与请求匹配的文件或脚本的完整本地文件系统路径,如果在引用 REQUEST_FILENAME 时服务器已经确定了这一点。否则,例如在虚拟主机上下文中使用时,与 REQUEST_URI 的值相同。

您可以将其视为真实文件系统上可能存在或不存在的路径。传入的请求可能类似于 http:\\example.com\blah.php。如果那是一个真实的文件,那么你说你想使用它。但是服务器上可能没有真正的名为 blah.php 的文件。在这种情况下,您不会返回 404 错误,而是将请求传递到名为 index.php 的文件中。

简而言之,您不应将 URL 的各个部分视为文件或目录。它们不需要映射到真实的文件系统路径(尽管它们经常这样做)。

于 2013-01-08T02:54:54.650 回答