在Laravel中使用https会抛出apache错误

时间:2014-06-20 19:30:55

标签: php apache laravel-4

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

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

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

这肯定会重写我使用https代替http的网址,但该页面会返回Apache错误:

  

未找到

     

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

     

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>

3 个答案:

答案 0 :(得分:3)

我遇到的问题实际上是在虚拟主机中缺少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,常规网址将与https一起使用,例如http://beta.mysite.com/registerhttps://beta.mysite.com/register会路由到同一个地方。

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

答案 1 :(得分:1)

这对我有用:

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

(从我最初的评论中移开,因此更容易找到)

答案 2 :(得分:0)

好的,现在有了你的.htaccess我相信我发现了阻塞点。

我所做的关键是从底部移动https SERVER_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>

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

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