0

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

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”而不是一个。该规则在网络酒店中按预期工作,并且过去它在本地对我有用。这令人费解,我想要一个解释。

4

1 回答 1

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]

现在您的代码中的问题:

  1. RewriteRulein.htaccess不开始与带条纹的前导斜杠匹配mod_rewrite
  2. 您需要避免重新匹配这些规则,RewriteCond %{REQUEST_FILENAME} !-f否则mod_rewrite将继续添加.phpURI。
于 2013-09-21T16:51:53.290 回答