将 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/register
和 https://beta.mysite.com/register
将路由到同一个地方。
这样,默认的 .htaccess 文件和安全路由重定向工作。
【讨论】:
感谢您的回答,引导我朝着正确的方向前进。我使用了一个较短的版本,虽然它有效:这对我有用:
<Directory "/path/to/public/dir"> AllowOverride all </Directory>
(从我最初的评论中移出,以便更容易找到)
【讨论】:
【参考方案3】:好的,现在有了你的.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>
即使 .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 一起使用会引发错误
将 Object.defineProperty 与 Angular 一起使用会引发 TypeError: Cannot assign to read only property (property)