我正在尝试将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会触发处理程序并按预期工作。
有人可以解释发生了什么,为什么?我忽略了一些配置吗?
感谢。
答案 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处理。