强制silex框架生成https链接

时间:2015-06-03 09:41:53

标签: php symfony https routing silex

我的整个应用程序应该通过HTTPS访问, vhost已正确配置,当我使用HTTPS前缀调用任何应用程序页面时,它会正确响应。

但是,当我尝试通过应用程序中生成的链接访问页面时。它总是指向常规的HTTP链接。

我首先尝试使用.htaccess文件将所有流量重定向到HTTPS。花了几个小时尝试我在网上找到的每个重定向方法,但由于某种原因,我总是得到一个无限重定向循环。

现在我试图以不同的方式解决这个问题:直接在HTTPS中生成我的链接。我的所有链接都是使用twig-bridge提供的URL()函数生成的。

使用Symfony

进行配置非常简单

但我无法弄清楚如何用Silex做到这一点。是否有一种简单的方法可以在Silex中更改路由方案以强制使用HTTPS前缀生成每个链接?

5 个答案:

答案 0 :(得分:4)

requireHttps()添加到路由生成器,就可以了。

示例:

$app->get('/hello-world', function($app) {
    return 'Hello world';
})
->bind('hello') // Set route name (optional of course)
->requireHttps(); // This would force your url with https://

您还可以查看API以获取更多信息。你会在那里找到你需要的一切。

答案 1 :(得分:1)

将环境变量HTTPS设置为on

Nginx配置位置:fastcgi_param HTTPS on;
Apache的.htaccess或vhost配置:SetEnv HTTPS on

请注意,官方文档中的默认nginx配置会将此变量设置为off,这可能会被复制到https网站并且错误:
http://silex.sensiolabs.org/doc/web_servers.html
Ctrl + F - fastcgi_param HTTPS off;

答案 2 :(得分:1)

如果您使用Controller Providers,则可以使用Controller类中的requireHttps()方法为整个路径范围要求HTTPS:

namespace Acme;

use Silex\Application;
use Silex\Api\ControllerProviderInterface;

class HelloControllerProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory'];
        $controllers->get('/', function (Application $app) {
            return $app->redirect('/hello');
        });
        $controllers->get('/another-page', 'Acme\HelloControllerProvider::doSomething')->bind('another-page');
        // here it goes
        $controllers->requireHttps();
        // or even make it more flexible with a config variable
        // if ($app['config']['require_https']) (
        //     $controllers->requireHttps();
        // }
        return $controllers;
    }
}

答案 3 :(得分:0)

对于那个具体案例,我解决了在app.php中声明基本URL的问题:

$app['customBaseUrl'] = 'https://mybaseurl';

然后使用此自定义baseUrl为我的所有链接添加前缀。这些链接不再由url()twig函数生成。

虽然不是最漂亮的方式。如果您的服务器配置允许您使用它,我会推荐Artamiel的答案。

答案 4 :(得分:0)

另一种选择是在SecurityServiceProvider设置中使用access_control(如果您使用此设置)通过指定某些路由来指定某些路由需要使用https 'requires_channel'=>安全配置的access_control部分中的“https”。