我正在努力确保我的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>
答案 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/register
和https://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逻辑也会按预期工作。