2

我在 httpd.conf 文件(而不是 .htaccess 文件)中使用 mod_rewrite,我想知道是否有一个可以使用的变量来表示整个请求;ieDOCUMENT_ROOT代表“path/to/htdocs”并REQUEST_FILENAME代表“/path/to/file.php”。是否有一个 Apache 变量可以同时代表这两个变量,例如 "path/to/htdocs/path/to/file.php" ?

我问的原因是在我的重写指令中,这不起作用:

RewriteCond %{REQUEST_FILENAME} -f

但这确实:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f

奇怪的是,我见过的所有教程都使用第一种格式,但这对我不起作用,我自己想出了第二种格式——而且我从未见过使用第二种格式在任何教程中。这是否与我在 httpd.conf 而不是 .htaccess 文档中编写的事实有关?

当我输出 %{REQUEST_FILENAME} 变量时,它不包括文档根。

4

2 回答 2

1

%{DOCUMENT_ROOT}不是website.com,它是与站点DocumentRoot指令相关联的文件系统上的本地路径。例如:/var/www/localhost/htdocs

如果您想要website.com,那么您要么想要%{SERVER_NAME}(由UserCanonicalName指令定义),要么%{HTTP_HOST}Host:请求标头定义。

此外,%{REQUEST_FILENAME} 包括文档根目录,它或多或少相当于:%{DOCUMENT_ROOT}%{REQUEST_URI}. 所以给定上面的文档根示例,以及 的请求 URI /images/title.png,那么%{REQUEST_FILENAME}将是/var/www/localhost/htdocs/images/title.png

如果您正在寻找的是:website.com/path/to/file.php,那么,没有。没有一个变量可以为您组合在一起。你要么想要:

%{HTTP_HOST}%{REQUEST_URI}

或者

%{SERVERNAME}%{REQUEST_URI}
于 2013-05-24T00:15:29.527 回答
1

这是否与我在 httpd.conf 而不是 .htaccess 文档中编写的事实有关?

是的。来自Apache 文档

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

并且REQUEST_URI是“请求的 URI 的路径组件,例如/index.html”。

奇怪的是,我见过的所有教程都使用第一种格式

因为大多数教程都是针对 .htaccess (或<Directory>)上下文编写的。

如果在每个服务器上下文中使用(即,在请求映射到文件系统之前)SCRIPT_FILENAME并且REQUEST_FILENAME不能包含完整的本地文件系统路径,因为在此处理阶段该路径是未知的。在这种情况下,两个变量最初都将包含 的值REQUEST_URI为了在每个服务器上下文中获取请求的完整本地文件系统路径,请使用基于 URL 的前瞻%{LA-U:REQUEST_FILENAME}来确定REQUEST_FILENAME.

于 2015-10-22T16:35:53.097 回答