问题: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
答案 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]