在IIS7上使用Slim PHP获取404错误

时间:2012-12-16 15:21:06

标签: iis slim

我正在尝试将Slim PHP框架与IIS7一起使用。现在在某些路线上,我一直从IIS获得404,我觉得这很困惑。这是我的索引php:

    require 'slim/slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();

$app->notFound(function () use ($app) {
    echo("not found!");
});
$app->get("/books/:id", function($id){
    echo("hello book " . $id . "!");
});
$app->get("/test",function(){
    echo("testing");
});

$app->run();

在IIS上(运行PHP 5.3)我设置了url重写以将所有请求发送到我的index.php文件并禁用目录浏览。这似乎工作正常,因为去localhost / books / 123会产生“你好书123!”。但是当我去localhost / test时,我只是从IIS得到了404错误!如果向该URL添加一个尾部斜杠,则会触发我的slim notFound处理程序,而不是我的路由处理程序。

如果我创建一个名为“test”的目录,它会停止404响应,但会触发修长的notFound处理程序而不是我所期望的定义的路由处理程序。这似乎很奇怪,因为我已禁用目录浏览。

我知道我的slim notFound处理程序工作正常,因为尝试localhost / abc / xyz会触发处理程序并按预期工作。

有人可以解释发生了什么,为什么?我忽略了一些配置吗?

感谢。

1 个答案:

答案 0 :(得分:3)

事实证明,这种奇怪的行为是由我在IIS上的网址重写规则引起的。卫生署!

我有正则表达式规则/.*重写到我的index.php文件,而不是使用。*作为正则表达式。 第一个斜杠没有作为重写URL的一部分包含在内,然后引起了我描述的问题。将正则表达式更改为仅*。修复所有内容。

如果有其他人遇到这样的问题,那么请仔细检查您的网址重写规则,即使它似乎工作正常!

我非常简单的web.config文件是:

<configuration>
<system.webServer>
    <rewrite>
        <rules>
            <rule name="slim catch all" enabled="true">
                <match url=".*" />
                <action type="Rewrite" url="/index.php" />
                <conditions>
                    <add input="{URL}" pattern="/content/.*" negate="true" />
                </conditions>
            </rule>
        </rules>
    </rewrite>
</system.webServer>

注意:这是在IIS上使用URL Rewrite 2.0 Index.php是设置所有Slim路由的文件。条件是停止对/ content / path的请求通过Slim进行路由 - 这使得它成为存储图像,css文件和javascript等内容的好地方,因为响应应该更快,因为它们不被Slim处理。