我在httpd.conf文件中使用mod_rewrite(不在.htaccess文件中),我想知道是否有一个我可以使用的变量代表整个请求; ie DOCUMENT_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}变量时,它不包含文档根目录。
答案 0 :(得分:1)
%{DOCUMENT_ROOT}
不是 website.com ,它是文件系统上与网站DocumentRoot
指令相关联的本地路径。例如:/var/www/localhost/htdocs
如果您想要 website.com ,那么您要么%{SERVER_NAME}
(由UserCanonicalName指令定义)或%{HTTP_HOST}
由主持人:请求标题。
此外,%{REQUEST_FILENAME}
包含文档根目录,它或多或少相当于:%{DOCUMENT_ROOT}%{REQUEST_URI}
。因此,鉴于文档根目录的上述示例和/images/title.png
的请求URI,%{REQUEST_FILENAME}
将为/var/www/localhost/htdocs/images/title.png
如果你要找的是: website.com/path/to/file.php ,那么,没有。没有一个变量能够为您整合这些变量。你要么:
%{HTTP_HOST}%{REQUEST_URI}
或
%{SERVERNAME}%{REQUEST_URI}
答案 1 :(得分:1)
是否与我在httpd.conf而不是.htaccess文档中写的事实有关?
是。来自Apache docs:
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
的最终值。