强制Silex框架生成HTTPS链接

5
我的整个应用程序都应该通过HTTPS访问,虚拟主机已正确配置,当我使用HTTPS前缀调用任何应用程序页面时,它会正确响应。
但是,当我尝试通过应用程序中生成的链接访问页面时,它总是指向常规的HTTP链接。
我首先尝试使用.htaccess文件将所有流量重定向到HTTPS。花了几个小时尝试网络上找到的每种重定向方法,但出现了无限重定向循环的情况。
现在我正在尝试以不同的方式解决此问题:直接在HTTPS中生成我的链接。所有链接都是使用twig-bridge提供的URL()函数生成的。
使用Symfony非常容易进行配置。
但是我无法弄清楚如何在Silex中实现。是否有一种简单的方法可以更改Silex中的路由方案,以强制每个链接都使用HTTPS前缀生成?
5个回答

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文档,里面包含了更多相关信息。你可以在那里找到所需的一切。

不错,这似乎是正确的做法。然而,它触发了与我尝试使用 .htaccess 文件时遇到的相同重定向循环。这可能意味着虚拟主机配置中出现了问题。 - mb3rnard

1

将环境变量HTTPS设置为on

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

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


1
如果您使用控制器提供者,您可以使用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;
    }
}

0
对于这个特定的情况,我在app.php中声明了一个基本URL来解决问题。
$app['customBaseUrl'] = 'https://mybaseurl';

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

虽然这不是最美观的方法。如果您的服务器配置允许使用,我建议使用 Artamiel 的答案。


那就意味着你找出了那些循环出了什么问题?如果你的应用程序在这种情况下运行良好,那么从技术上讲,它也应该能够与URL生成器一起正常工作。 - Artamiel
由于某种原因,添加->requireHttps(); 产生了与在.htaccess文件中重定向相同的结果。我想出了虚拟主机配置有问题,但我不知道具体是什么,因为我没有访问权限。而且托管公司需要花费相当长的时间来处理这些问题。我必须找到一个快速解决方法,这个方法起了作用。 - mb3rnard

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接