.htaccess重定向,如果文件存在

时间:2011-06-10 12:28:32

标签: php apache .htaccess mod-rewrite redirect

我希望根据目录中是否存在文件,使用.htaccess重定向到一个页面或另一个页面。

基本上我需要将index.php的所有访问者发送到home.php页面如果splash.php 不存在,或者如果splash.php 那么发送到splash.php页面存在于目录中,到目前为止我有这个......

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} index.php
RewriteCond %{DOCUMENT_ROOT}/splash.php -f
RewriteCond %{SCRIPT_FILENAME} !splash.php
RewriteRule ^.*$ /splash.php [L]

如果只有我特意将mysite.com/index.php作为我的网址存在,它才会将访问者发送到mysite.com/splash.php(如果仅使用mysite.com网址,则无效)。

我理解我的代码的前3行,但不是!splash.php -f位(我从SO上找到的其他重定向代码中获得了这些代码)。

如果splash.php不存在,我如何重定向到home.php?

干杯!

3 个答案:

答案 0 :(得分:3)

尝试此规则。它应该适用于mysite.com/index.php,mysite.com/或mysite.com

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/splash.php -f
RewriteCond %{SCRIPT_FILENAME} !splash.php
RewriteRule ^(index\.php|/|)$ /splash.php [L]

答案 1 :(得分:1)

你需要把它分成多个块,所以试试这个(如果它存在,则转到splash.php,无论它们是否在文件名中有index.php,然后如果不存在splash去home.php):

RewriteEngine on

RewriteCond %{DOCUMENT_ROOT}/splash.php -f
RewriteCond %{SCRIPT_FILENAME} !splash.php
RewriteRule ^.*$ /splash.php [L]

RewriteCond %{DOCUMENT_ROOT}/splash.php !-f
RewriteRule ^.*$ /home.php [L]

答案 2 :(得分:0)

伙伴,我添加了一个快速的.htaccess,它对我来说非常适合。我不确定你的配置会有什么不同。为了避免混淆,这里是我正在使用的Apache(2)vhost:

<VirtualHost *:80>
   DocumentRoot "/usr/local/zend/apache2/htdocs/test-setup"
   ServerName test-setup
   ErrorLog /var/log/apache2/lps-version-one_test-setup_error_log
   LogLevel warn
   CustomLog /var/log/apache2/lps-version-one_test-setup_access_log combined
    <Directory "/usr/local/zend/apache2/htdocs/test-setup">
        DirectoryIndex index.php
        AllowOverride All 
        Order allow,deny
        Allow from all 
    </Directory>
</VirtualHost>

当我在目录中有两个文件时,我被重定向到splash.php(即使url中文件的名称没有改变 - 在内部我被重定向到splash.php)。当我重命名splash.php(或删除它)时,我只看到index.php。当我把它放回去时,重定向正常工作。当我特意把index.php放在url中,两个文件都可用时,我被重定向到splash.php。

Fwiw,关于mod_rewrite最值得记住的事情之一是:

  

尽管有大量的例子和文档,   mod_rewrite是伏都教。该死的很酷   伏都教,但仍然是伏都教。    - Brian Moore bem@news.cmc.net