2011-03-25 112 views
8

问题:一些PHP页面的等效(apple.html,apple.php; orange.html,orange.php),但不是所有的(grapes.html)。htaccess重写,如果重定向文件存在

目标:如果php版本存在,重写,否则保留html版本。

我:

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^(.*)\.html$ /$1.php [R] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.php$ /$1.html [R] 

有趣的问题:

如果我不把/在$ 1.PHP前然后我结束了:site.com/document/root/path(即:site.com/home/user/www/file.php)

当调用第二个RewriteRule时,我得到http://site.com/http:/site.com/page.html,它告诉我有太多的重定向。注意第二个http中只有一个/。

我已经取得了一些进展,我添加了RewriteBase /,并在$ 1之前删除了/,但仍然收到了太多的重定向错误(网站site.com/page.html导致了太多重定向清除您的Cookie或允许使用第三方Cookie可能会解决问题,否则可能是服务器配置问题,而不是计算机问题)。

看来,如果我只是重写HTML - > PHP - > HTML我得到了同样的错误。所以它看起来像逻辑工作,但这种逻辑是不允许的。我想不出任何其他方式可以看到文件的“php版本”是否存在?我认为这是唯一的方式做类似的东西:

RewriteCond ^(.*)\.html$ $1.php -f 
RewriteRule ^(.*)\.html$ $1.php [R] 

不幸的也并非完全奏效(我猜是因为它对状态行三段)。我试图让名不带扩展名,然后说,如果filename.php是一个文件,重写page.html中到page.php文件

回答

13

你应该能够实现,通过使用两个条件:

RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [R,L] 

第一个条件检查文件名是否以.html结束,第二个条件使用第一个条件中的反向引用%1来检查.php版本是否存在。

希望它有帮助。 :)

+0

当我第一次读到您的电子邮件,我很喜欢啊哈哈!然后我尝试了它,但没有效果:(即使php存在,它仍然会去page.html。在第二个RewriteCond中,你是否意味着$ 1而不是%1? – user677285 2011-03-30 14:25:35

+0

我刚刚在我的apache上测试过,它工作正常。你使用的是httpd.conf还是.htaccess?如果有其他的重写规则,你会发布所有重写规则吗?%符号应该用在RewriteCond中,$用在RewriteRule中,至少这是我记得的。 – szemian 2011-03-30 14:35:56

1

我很抱歉回答sooooo晚了,但您将需要添加RewriteBase指令,使其工作。

我有同样的问题(与您的http:/ stufff)和固定这样说:

RewriteBase /your/application_path 
RewriteCond %{REQUEST_FILENAME} (.*)\.html$ 
RewriteCond %1\.php -f 
RewriteRule ^(.*)\.html$ $1.php [L] 

希望这将有助于!

0

我也想将所有.html请求重写为.php文件,但前提是.php文件存在。但我的变化是,只有当实际的.html文件不存在时才会发生这种情况。

所以只有对不存在的.html文件的调用重写为.php文件,如果它们通过这些规则存在:(我也在XAMP本地服务器上测试了这一点,并且还测试了这个成功的Apache在线服务器! )

# Rewrite rules to .html file to .php if the .php version 
# does actually exist. 

RewriteCond %{REQUEST_FILENAME} (.*)\.html [NC] 
RewriteCond %{REQUEST_FILENAME} !-f [NC] 
RewriteCond %1\.php -f [NC] 
RewriteRule ^(.*).html$ $1.php [NC] 
  1. 它首先检查所请求的文件是一个。html文件(我们不希望.jpg,.css,.pdf等被重写)。
  2. 它检查.html文件是否不存在。 (如果它确实存在,我们不想重写为.php)。
  3. 然后检查.php版本是否存在(我们不想重写为不存在的.php文件)。
  4. 然后重写的.html到.PHP