将 https 与 Laravel 一起使用会引发 apache 错误

Posted

技术标签:

【中文标题】将 https 与 Laravel 一起使用会引发 apache 错误【英文标题】:Using https with Laravel throws apache error 【发布时间】:2014-08-11 15:10:33 【问题描述】:

我正在努力确保我的 Laravel 项目中使用的所有路由都使用 https

我尝试通过在 `filter.php 文件中的 App::before() 过滤器中添加重定向来做到这一点,如下所示:

if (!Request::secure())
    return Redirect::secure(Request::path());

这肯定会重写我的网址以使用 https 而不是 http,但页面返回时出现 Apache 错误:

找不到

在此服务器上找不到请求的 URL /register。

Apache/2.4.9 (Ubuntu) 服务器位于 beta.mysite.com 端口 443

还有什么我需要更改以允许 laravel 看到 https 请求吗?

编辑:这是我当前的.htaccess 文件内容:

<IfModule mod_rewrite.c>
    #Options -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %SERVER_PORT 80
    RewriteRule ^(.*)$ https://beta.mysite.com/$1 [R,L]
</IfModule>

【问题讨论】:

您是否将https 正确设置为使用与您的非https 站点相同的DocumentRoot 是的,我的证书指向DocumentRoot /var/www/public,这是非http访问的文档根目录。 “我的证书正在指向”你是什么意思?基本上,您的http 端口 80 配置需要与您的 https 端口 443 配置 100% 相同。 对不起,我误解了你的问题。我的 443 端口肯定与我的非 https 端口设置相同。当我转到它加载的 index.php 页面时,我应该添加,但是当我尝试访问 laravel 中的任何其他路由时,我得到了上述错误。 “在此服务器上找不到请求的 URL /register。”您是否 100% 确定您的 .htaccess 已设置为 https 设置? 【参考方案1】:

我遇到的问题实际上是 https 站点的虚拟主机中缺少配置项。

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost                                                                       

                DocumentRoot /var/www/public


                # The section I was missing START
                <Directory />                                                                                         
                        Options FollowSymLinks                                                                        
                        AllowOverride None                                                                            
                </Directory>                                                                                          

                <Directory /var/www/>                                                                                 
                        Options -Indexes FollowSymLinks MultiViews                                                    
                        AllowOverride All                                                                             
                        Order allow,deny
                        allow from all
                </Directory>
                # The section I was missing End


...

这些规则与 http(端口 80)的虚拟主机中的规则相同。如果没有这些,laravel 无法获取正确的路线。

一旦我为端口 443 设置了这些,常规 url 就可以与 https 一起使用,例如http://beta.mysite.com/registerhttps://beta.mysite.com/register 将路由到同一个地方。

这样,默认的 .htaccess 文件和安全路由重定向工作。

【讨论】:

感谢您的回答,引导我朝着正确的方向前进。我使用了一个较短的版本,虽然它有效: AllowOverride all @SabrinaGelbart 你刚刚救了我的命【参考方案2】:

这对我有用:

<Directory "/path/to/public/dir"> AllowOverride all </Directory>

(从我最初的评论中移出,以便更容易找到)

【讨论】:

【参考方案3】:

好的,现在有了你的.htaccess,我相信我发现了瓶颈。

我所做的关键是将httpsSERVER_PORT 的检查从底部移动并重新检查以检查,“这个端口不是443 吗?”而不是“这是 80 端口吗?”

<IfModule mod_rewrite.c>
    #Options -MultiViews
    RewriteEngine On

    ReWriteCond %SERVER_PORT !^443$ 
    RewriteRule ^/?(.*) https://%HTTP_HOST/$1 [NC,R,L]

    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ /index.php?/$1 [L]

</IfModule>

根据您调整后的控制器查看您原来的.htaccess,我相信我知道发生了什么:

<IfModule mod_rewrite.c>
    #Options -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    RewriteCond %SERVER_PORT 80
    RewriteRule ^(.*)$ https://beta.mysite.com/$1 [R,L]
</IfModule>

即使 .htaccess 路由到端口 80,您的 if (!Request::secure()) 也可以工作。这意味着 Laravel 逻辑发生在 .htaccess 发挥作用之后。但是因为.htaccess 中用于将 SEO 友好 URL 重写为 /index.php 的路由器规则发生在 https 检查之前,https 站点 100% 不知道如何处理像 https://beta.mysite.com/register 这样的 URL。

这个概念可能需要一段时间才能理解,但我相信一旦你的 .htaccess 问题得到解决,那么 Laravel 逻辑也会按预期工作。

【讨论】:

我想我开始关注你了。对不起,我在编写 htaccess 文件方面的知识非常有限。路由现在正在加载,但在所有 url 中都包含 index.php。根据您对 htaccess 文件和过滤器重定向规则触发顺序的描述,我试图弄清楚如何正确编写一个允许访问所有路由但不包括 index.php 的 htaccess 文件url 以便我获得原始样式的 url。 @ChrisSchmitz “...htaccess 文件,该文件将允许访问所有路由,但在 url 中不包含 index.php...”您想多了。只需使用我重写的.htaccess。或者更好的是,将检测不是https 的内容完全取出并尝试一下。这应该可以工作。 好的,所以我使用了您重写的 .htaccess 并在 laravel 过滤器中取出了重定向,该过滤器检测请求是否不是 https。当我加载 url http://beta.mysite.com/register 时,我仍然收到错误消息。唯一可行的方法是,如果我使用 url http://beta.mysite.com/index.php/register,它将重写为 https://beta.mysite.com/index.php/register 很抱歉,我并不是想成为一个痛苦的人,我只是很难解决这个问题。 @ChrisSchmitz “……在检测请求是否不是 https 的 larval 过滤器中取出重定向。”你为什么这么做?保持这一点。保持你所拥有的一切。只需使用.htaccess。当我说“或者更好,采用检测是否不是 https 的内容的行……”我的意思是在 .htaccess 中。把这几行拿出来看看能不能用ReWriteCond %SERVER_PORT !^443$ RewriteRule ^/?(.*) https://%HTTP_HOST/$1 [NC,R,L]

以上是关于将 https 与 Laravel 一起使用会引发 apache 错误的主要内容,如果未能解决你的问题,请参考以下文章

将 fillna 与两个多索引数据帧一起使用会引发 InvalidIndexError

将 ExtractTextPlugin 与 WebPack 2.2.0 RC3 一起使用会引发错误

将 Laravel 存储库与数据表一起使用

将 Object.defineProperty 与 Angular 一起使用会引发 TypeError: Cannot assign to read only property (property)

将 RGBA32F 纹理与帧缓冲区一起使用会引发 INVALID_ENUM 错误

将 Laravel Passport 与移动应用程序一起使用