2010-11-08 109 views
2

我有一个安全/子目录中有几个文件,我想执行一些简单的RewriteRules,只是默认PHP扩展。我很难让这些工作,并经过一些试验和错误后偶然发现以下。.htaccess RewriteRule - DOCUMENT_ROOT和RewriteBase

RewriteEngine On 
RewriteBase /secure 

# Force PHP extension if not a directory 
RewriteCond %{DOCUMENT_ROOT}/secure/%{REQUEST_URI} -d 
RewriteRule ^(.*)$ - [L] 

RewriteCond %{DOCUMENT_ROOT}/secure/$1.php -f 
RewriteRule ^((.*/)*[^./]+)/*$ $1.php [L] 

我缺乏了解是围绕%{DOCUMENT_ROOT}和附加/secure/。我相信%{DOCUMENT_ROOT}或使用RewriteBase将处理此。然而,这些作品中的每一件似乎都是必需的。我想知道在我的情况下为什么和什么都达到了。

回答

10

RewriteBase directive mod_rewrite专用于重定向步骤,在所有其他处理过程中被忽略。与文档所述相反,通常没有必要,因为(就像你的情况一样),将URL映射到DOCUMENT_ROOT以外的文件系统中的子目录是相当常见的。

那么,指令是干什么的?当您在使用.htaccess文件时在每个目录上下文中评估您的规则时,URL在Apache的请求处理链中很晚才传递给mod_rewrite。这意味着URL可能已经被部分转换为文件系统路径,所以/目录/子目录/文件中的路径实际上可能已经通过网络服务器经由/位置/子目录/文件被访问。

这似乎不是一个问题,但事实上,/位置/片断已成为mod_rewrite的一个问题。为了理解为什么,你必须知道mod_rewrite是如何使每个目录上下文重写成为可能的。

当您在.htaccess文件中执行重写时,mod_rewrite会将修改后的请求作为内部重定向重新映射到Apache,就像它是一个URL一样。这是有问题的,因为请求路径可能不是合适的URL传递。举例来说,如果请求结束了在/目录/子目录/文件(我们假设是DOCUMENT_ROOT外),我们可能有这样的规则/directory/.htaccess

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* index.php 

这将检查/子目录/文件,确定它不是一个实际的文件,并将其重写为index.php。此时,必须将新的URL返回给Apache以进行内部重定向以完成重写。由于它没有参考点,它最终发送整个路径—,即它发送/directory/index.php。这不是你想要的,因为访问这个位置的URL实际上是/location/index.php。这就是RewriteBase用武之地。通过在.htaccess文件中指定

RewriteBase /location/ 

,目录前缀/目录/会被交换出去/位置/因为这改写后的处理的一部分,导致内部重定向到预期的URL /location/index.php

这也与外部重定向有关。如果您尝试仅使用[R]标志进行外部重定向,并且该路径没有前导斜杠,则整个目录将以上述方式发送回客户端,除非它被替换为RewriteBase。

虽然这些点都不会与您的情况相关,所以您应该没有指定RewriteBase即可。

%{DOCUMENT_ROOT}变量只是Apache内部DOCUMENT_ROOT变量的值,它在您的服务器/虚拟主机配置中设置。它始终对应于/要求解决的目录。 -f-d检查需要完整的文件系统路径,这就是为什么当使用它们时%{DOCUMENT_ROOT}需要预先添加到相对路径。

但是,为了解决当前请求的路径,mod_rewrite为您提供了%{REQUEST_FILENAME}变量。举例来说,假设.htaccess文件住在你的/安全子目录,您可以修改您的规则设置如下:

RewriteEngine On 

# Force PHP extension if not a directory 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^.*$ $0.php [L] 
+0

看看这个http://serverfault.com/questions/720085/htaccess的死因无限循环活服务器上,但是,作品上,本地主机 – sammyukavi 2015-09-04 12:04:50