在调用Silex之前,在URL中添加一个尾部的斜线

作为大多数框架,Silex依赖于重写规则来处理漂亮的URL。 build议使用此框架的默认.htaccess

RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] 

这是直接的,工作得很好。 但是,如果我也想重写请求uri始终包含一个结尾的斜杠我不能得到它的工作。 我曾尝试过使用以下规则。

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^(.*)/$ RewriteRule . %{REQUEST_URI}/ [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] 

为了debugging这个,我尝试了使用[R]标志强制redirect,我可以看到它的正确评估,但是这两个规则在一起并没有这样做,因为结果请求uri仍然没有结尾的斜杠。

总结一下: example.com/foo应该redirect到example.com/foo/ ,最后由index.php处理。 example.com/foo/应该由index.php处理而不做修改。

我不是mod_rewrite的专家,但是我在这里花了一段时间阅读文档,我有一种直觉,认为这应该可以通过这种方式来解决。

在此先感谢,亚历克斯

事实certificate,Apache和mod_rewrite实际上是他们应该给出在问题中显示的设置的方式。 PHP框架没有使用正确的URL。

当使用PHP与Apache,Apache创build几个服务器variables(即$_SERVER全球)。

因此,根据上面的重写规则,当用户导航到example.com/resource apache将首先重写为example.com/resource/ ,然后将所有内容交给index.php来处理。 不太明显的是$_SERVER['REQUEST_URI']variables没有改变,而$_SERVER['REDIRECT_URL']被设置为新的改写的uri。

所以不redirect的问题实际上是从来没有使用过由Apache引入的新的全局的框架。 为了使用这个全局variables,扩展现有的Silex/Application.php并覆盖它的run()方法,如下所示:

 class Application extends Silex\Application { public function run(Request $request = null) { if (null === $request) { if (isset($_SERVER['REDIRECT_URL'])) { $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL']; } $request = Request::createFromGlobals(); } $response = $this->handle($request); $response->send(); $this->terminate($request, $response); } 

}

希望这可以帮助!

亚历克斯