作为大多数框架,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); }
}
希望这可以帮助!
亚历克斯