我可以在mod_rewrite中使用一个等于%{DOCUMENT_ROOT}%{REQUEST_FILENAME}的变量吗?

时间:2013-05-24 00:06:14

标签: apache mod-rewrite

我在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}变量时,它不包含文档根目录。

2 个答案:

答案 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_FILENAMEREQUEST_FILENAME不能包含完整的本地文件系统路径,因为在此处理阶段路径未知。在这种情况下,两个变量最初都包含REQUEST_URI的值。 要在每服务器上下文中获取请求的完整本地文件系统路径,请使用基于URL的预测%{LA-U:REQUEST_FILENAME}来确定REQUEST_FILENAME的最终值。