今天我写了以下重写规则:
RewriteCond %{HTTP_HOST} ^visionale\.book [NC]
RewriteRule ^\/([^/]+)\/$ $1.php [L]
RewriteCond %{HTTP_HOST} ^(www\.)?visionale\.se [NC]
RewriteRule ^(.*)/$ $1.php
首先是我的笔记本电脑,我运行Apache,这是网络酒店的第二条规则。
在网络酒店上应用第一次重写会导致404 Not Found
神秘地在我的笔记本电脑上应用第二条规则导致找不到“pagename.php.php.php”。
现在我提供的解决方案在两个地方都有效,但我对实际发生的事情感到困惑。我的本地机器运行Apache 2.4.6。网络酒店经营Litespeed。所以这当然是不兼容的,但确切地说是如何。
我的猜测是Litespeed因缺少功能而错过了第一条规则,但为什么Apache没有得到更容易的,我过去曾多次使用过?
编辑:澄清问题。
这条规则:
RewriteRule ^\/([^/]+)\/$ $1.php [L]
我的网站上没有选择运行Litespeed。我的猜测是,这是因为Litespeed有一个有缺陷的重写实现。我希望确认这一预感或其他解释。
这条规则:
RewriteRule ^(.*)/$ $1.php
不再适用于我的开发机器 ,但它在过去一直有效。看起来很简单。以尾部斜杠结尾的任何内容都应该获得“.php”扩展名。但是,在我的开发机器上它增加了三个“.php”而不是一个。该规则按照网络酒店的预期运行,过去曾在我当地工作过。这很令人费解,我想解释一下。
答案 0 :(得分:0)
这两条规则都不正确。我先告诉你正确的代码:
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^visionale\.book$ [NC]
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ $1.php [L]
RewriteCond %{HTTP_HOST} ^(www\.)?visionale\.se$ [NC]
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/?$ $1.php [L]
现在代码中存在问题:
RewriteRule
中的.htaccess
无法与mod_rewrite
RewriteCond %{REQUEST_FILENAME} !-f
重新匹配这些规则,否则mod_rewrite
将继续在URI中添加.php
。