首页 文章

在.htaccess中,将DirectoryIndex优先化为RewriteRule

提问于
浏览
1

我想要在DirectoryIndex行中指定的文件可用时访问它们 . 例如 . 当有人在www.mywebsite.com/mydir/中输入时,它会正确重定向 . 为此,我在我的.htaccess中有这样一句话:

DirectoryIndex index.html default.php

当文件名或目录不存在时,我希望它重定向到与我的.htaccess文件位于同一目录中的文件(target_handler.php) . 为此我在DirectoryIndex之后放了几行:

RewriteEngine On
RewriteCond %{ENV:URI} ^$
RewriteRule ^(.*)$ - [ENV=URI:$1]

RewriteCond %{ENV:BASE} ^$
RewriteCond %{ENV:URI}::%{REQUEST_URI} ^(.*)::(.*?)\1$
RewriteRule ^ - [ENV=BASE:%2]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}target_handler.php [L,QSA]

我想要的是让Apache首先检查是否有index.html或default.php可用,并且只有在不可用时执行重写 . 目前行为似乎是随机的(?),所以如果有人输入www.mywebsite.com/mydir/,那么Apache有时会先重写,而不检查指定文件夹中是否有index.html .

帮助赞赏

PS:我正在测试使用:xampp Apache / 2.4.17(Win32)OpenSSL / 1.0.2d PHP / 5.6.15

1 回答

  • 0

    您可以省略 DirectoryIndex 并使用 mod_rewrite 本身完成所有操作:

    RewriteEngine On
    
    RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
    RewriteRule ^(.*)$ - [E=BASE:%1]
    
    RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}index\.html -f
    RewriteRule ^ index.html [L]
    
    RewriteCond %{DOCUMENT_ROOT}%{ENV:BASE}default\.php -f
    RewriteRule ^ default.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^target_handler\.php$ target_handler.php [L,NC]
    

相关问题