Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htaccess如果存在重定向文件,则重写_Php_.htaccess_Rewrite - Fatal编程技术网

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

Php htaccess如果存在重定向文件,则重写,php,.htaccess,rewrite,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等价物的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)

当调用第二个重写规则时,我得到一个消息,它告诉我重定向太多了。请注意,第二个http中只有一个/

我已经取得了一些进展,在$1之前添加了RewriteBase/并删除了/,但仍然出现了重定向太多的错误(位于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

您应该能够通过使用两个条件来实现这一点:

RewriteCond %{REQUEST_FILENAME} (.*)\.html$
RewriteCond %1\.php -f
RewriteRule ^(.*)\.html$ $1.php [R,L]
第一个条件检查文件名是否以.html结尾,第二个条件使用第一个条件中的反向引用%1检查.php版本是否存在


希望有帮助。:

很抱歉这么晚才回答,但您需要添加RewriteBase指令才能正常工作

我也遇到了同样的问题(与您的http:/stufff有关),并通过以下方式解决了此问题:

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

希望这会有帮助

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

因此,只有对不存在的.html文件的调用才被重写为.php文件,如果它们确实存在,则按照以下规则:(我还成功地在XAMP本地服务器和Apache在线服务器上进行了测试!)

  • 它首先检查请求的文件是否是.html文件(我们不希望重写.jpg、.css、.pdf等)
  • 它检查该.html文件是否不存在。(如果它确实存在,我们不想重写为.php。)
  • 然后检查.php版本是否存在(我们不想重写为不存在的.php文件)
  • 然后它将.html重写为.php

  • 当我第一次读到你的电子邮件时,我就像是啊哈!然后我试了一下,但没有用:(即使php存在,它仍然会转到page.html。你是不是碰巧在第二次重写时指的是$1而不是%1?我刚刚在apache上进行了测试,它可以工作。你使用的是httpd.conf还是.htaccess?如果还有其他重写规则,你会发布所有的重写规则吗?%symbol应该在重写中使用,$在重写规则中使用,至少是这样的。)这就是我所记得的。:)
    # 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]