与大多数框架一样,Silex 依赖重写规则来处理漂亮的 URL。建议与此框架一起使用的默认 .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]
为了调试这个问题,我尝试使用标志强制重定向[R]
,我可以看到它评估正确,但是两个规则一起不起作用,因为生成的请求 uri 仍然没有尾随斜杠。
总结一下:
example.com/foo
应该重定向到example.com/foo/
并最终由 处理index.php
。
example.com/foo/
应该由 不加修改地处理index.php
。
我不是 mod_rewrite 方面的专家,但我花了大量时间阅读文档这里我有直觉认为这应该可以通过这种方式解决。
提前致谢,亚历克斯
答案1
事实证明,apache 和 mod_rewrite 确实按照问题中所示的设置正常工作。php 框架没有使用正确的 url。
当将 php 与 apache 一起使用时,apache 会创建几个服务器变量(即$_SERVER
全局变量)。
因此,根据上述重写规则,当用户导航到example.com/resource
apache 时,将首先重写到example.com/resource/
,然后将所有内容交给index.php
处理。不太明显的是,$_SERVER['REQUEST_URI']
变量没有改变,而是$_SERVER['REDIRECT_URL']
用新的重写 uri 设置了。
因此,无法重定向的问题实际上是框架从未使用过 apache 引入的新全局变量。要使用这个全局变量,请扩展现有的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);
}
}
希望这可以帮助!
亚历克斯