如果存在重定向文件,则重写htaccess

时间:2011-03-25 19:10:29

标签: php .htaccess rewrite

问题:php等价物的一些html页面(apple.html,apple.php; orange.html,orange.php),但不是全部都是(grapes.html)。

目标:如果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

3 个答案:

答案 0 :(得分:13)

你应该能够通过两个条件来实现这一目标:

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

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

希望它有所帮助。 :)

答案 1 :(得分:1)

我很抱歉很晚才回答,但你需要添加RewriteBase指令才能使它工作。

我有同样的问题(使用你的http:/ stufff)并以这种方式修复它:

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

希望它会有所帮助!

答案 2 :(得分: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