重写服务器之间的奇怪区别

时间:2013-09-21 15:02:08

标签: regex apache .htaccess mod-rewrite

今天我写了以下重写规则:

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”而不是一个。该规则按照网络酒店的预期运行,过去曾在我当地工作过。这很令人费解,我想解释一下。

1 个答案:

答案 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中的
  1. .htaccess无法与mod_rewrite
  2. 划分的前导斜杠匹配
  3. 您需要避免使用RewriteCond %{REQUEST_FILENAME} !-f重新匹配这些规则,否则mod_rewrite将继续在URI中添加.php