1

我正在尝试将 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 会产生“hello book 123!”。但是当我去 localhost/test 时,我只是从 IIS 收到 404 错误!如果向该 url 添加一个斜杠,我的 slim notFound 处理程序将被触发,而不是我的路由处理程序。

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

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

任何人都可以解释发生了什么以及为什么?我是否忽略了一些配置?

谢谢。

4

1 回答 1

3

事实证明,这种奇怪的行为是由我在 IIS 上的 url 重写规则引起的。嗬!

我将正则表达式规则 /.* 重写为我的 index.php 文件,而不是使用 .* 作为正则表达式。第一个斜杠没有包含在重写的 url 中,这导致了我描述的问题。将正则表达式更改为 .* 修复了所有问题。

如果其他人遇到这样的问题,请仔细检查您的 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 路由的文件。条件是停止通过 Slim 路由对 /content/ 路径的请求 - 这使它成为存储图像、css 文件和 javascript 等内容的好地方,因为响应应该更快,因为它们不被 Slim 处理。

于 2012-12-24T14:55:15.270 回答