如何强制 Laravel 项目对所有路由使用 HTTPS?
Posted
技术标签:
【中文标题】如何强制 Laravel 项目对所有路由使用 HTTPS?【英文标题】:How to force Laravel Project to use HTTPS for all routes? 【发布时间】:2016-06-20 00:27:04 【问题描述】:我正在处理一个需要安全连接的项目。
我可以通过以下方式设置路由、uri、资产以使用“https”:
Route::get('order/details/id', ['uses' => 'OrderController@details', 'as' => 'order.details', 'https']);
url($language.'/index', [], true)
asset('css/bootstrap.min.css', true)
但一直设置参数似乎很累。
有没有办法强制所有路由生成 HTTPS 链接?
【问题讨论】:
【参考方案1】:将它放在 boot() 方法中的 AppServiceProvider 中
if($this->app->environment('production'))
\URL::forceScheme('https');
【讨论】:
这是一个不错的选择,而不是更新任何服务器文件。 感谢它在 laravel 7 和 8 中完美运行,再次感谢【参考方案2】:这里有几种方法。选择最方便的。
配置您的网络服务器以将所有非安全请求重定向到 https。 nginx 配置示例:
server
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
使用 https 设置您的环境变量 APP_URL
:
APP_URL=https://example.com
使用助手secure_url() (Laravel5.6)
将以下字符串添加到 AppServiceProvider::boot() 方法(适用于 5.4+ 版本):
\Illuminate\Support\Facades\URL::forceScheme('https');
更新:
路由组的隐式设置方案(Laravel5.6):
Route::group(['scheme' => 'https'], function ()
// Route::get(...)->name(...);
);
【讨论】:
在我的 Laravel 5.7.265.
中以某种方式禁用了该网站,但是 4.
起到了魅力 :)
我在 HostGator 上托管我的网站,我进入 cPanel 工具并修改了我的 Laravel 5.7 代码并执行了第 4 次,当我通过输入 mysite.tech 访问我的网站时,我仍然会收到到我网站的不安全版本。如果我隐含地输入mysite.tech,那么它就可以工作。知道为什么 4 不起作用吗?【参考方案3】:
您可以在config/app.php
中设置'url' => 'https://youDomain.com'
,也可以使用中间件类Laravel 5 - redirect to HTTPS。
【讨论】:
中间件是要走的路。设置“url”属性对我不起作用(L 5.1)。 这仍然不令人满意。这只意味着通往http
的路由会被转发到https
的路由,但是转发对SEO排名不利
这应该由 .env 中的 APP_URL 变量设置
我的项目中有 API,这会按原样运行 API 吗?【参考方案4】:
我在web.php
或api.php
文件的末尾使用了它,它运行良好:
URL::forceScheme('https');
【讨论】:
我有一个托管我的 laravel 应用程序的 hostgator 帐户。如果我把它放在 Routes/web.php 中,它不会将我的网站重新路由到 https 并且 ssl 证书已打开。 您检查过 .htaccess 文件吗?你也可以在那里强制 https 重定向。 我有两个 htaccess 文件,一个在我的主应用程序目录中,另一个在我的公共 DIR 中。我将您下面帖子中的代码添加到我的主应用程序 .htaccess 文件中。我是否也应该将它添加到我的公共 .htaccess 中? 是的,我认为那是有效的。因为那是 index.php 文件的位置。您的 url 索引页面如何结束?无论如何,如果这对您不起作用,HostGator 提供了令人印象深刻的支持,您也可以评论他们的答案。 这样工作了 :D,但现在唯一的事情是,当网站重新定向时,它会将“/public/”添加到 url 的末尾。你知道我怎样才能把它剪掉吗?【参考方案5】:在您的 .htaccess 文件中使用以下代码会自动将访问者重定向到您网站的 HTTPS 版本:
RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]
【讨论】:
对于 laravel,它应该在公共文件夹中......这对我有用,而这里的其他解决方案在我的 cpanel 服务器上不起作用【参考方案6】:在 Laravel 7.x (2020) 中强制使用 Https
“2020 年更新?Url::forceScheme 对我来说表现得很时髦,但这很有效。”
https
代码sn-p.
resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');
-
在任何服务提供商启动方法中添加该 sn-p
1:打开
app/providers/RouteServiceProvider.php
。
2:然后将https代码sn-p添加到boot方法中。
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https');
parent::boot();
3:最后运行 php artisan route:clear && composer dumpautoload
清除 Laravel 缓存的路由和缓存的 Service Providers。
【讨论】:
您还需要在.htaccess
中进行配置还是仅此一项就足够了?
谢谢!这是唯一对我有用的解决方案,我只在带有负载均衡器的 AWS Elastic Beanstalk 上遇到了这个问题。我认为 Laravel 无法生成 https toutes,因为负载均衡器和 ec2(ubunto 服务器)之间的连接是 http。
@Nhan 当时不需要配置 .htaccess,这可能是因为它已经正确配置了。
@Husam 有趣的是,在发这篇文章的时候我也在做一个 AWS 项目!话虽如此 - 如果我没记错的话 - 我在本地开发中使用了这个 https 设置。我不确定其他实现是否不起作用,因为我们在本地发生了一些 AWS 事情,或者这只是一个有趣的巧合。无论哪种方式,感谢您指出 AWS 的详细信息!【参考方案7】:
将此添加到您的 .htaccess 代码中
RewriteEngine On
RewriteCond %SERVER_PORT 80
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]
将 www.yourdomain.com 替换为您的域名。这将强制您域的所有 url 使用 https。确保在您的域上安装和配置了 https 证书。如果您没有看到绿色的 https 是安全的,请在 chrome 上按 f12 并修复控制台选项卡中的所有混合错误。
希望这会有所帮助!
【讨论】:
这行得通!但在域名后添加index.php
。
我在域名后面也得到了 index.php?
有什么办法可以避免在最后添加 index.php 吗?它打破了我的路线
任何阅读此内容的人,只需将 'RewriteEngine On' 替换为 your.htaccess 文件中的上述代码【参考方案8】:
我更喜欢forceScheme
,而不是在网络服务器上进行。所以 Laravel 应用应该对此负责。
所以正确的方法是在你的app/Providers/AppServiceProvider.php
函数中添加 if 语句 boot
if (env('APP_ENV') === 'production')
\Illuminate\Support\Facades\URL::forceScheme('https');
提示:证明你已经正确配置了APP_ENV。转到您的 Linux 服务器,输入 env
这是在 Laravel 5,特别是 5.6 上测试的。
【讨论】:
这在 RouteServiceProvider 中对我有用,但由于某种原因不适用于 AppServiceProvider ?【参考方案9】:public function boot()
if(config('app.debug')!=true)
\URL::forceScheme('https');
在 app/Providers/AppServiceProvider.php 中
【讨论】:
最好根据环境(在这种情况下为非本地)来制作条件,而不是调试设置。【参考方案10】:对于 laravel 8,如果您尝试了以上所有方法,但浏览器重定向您的次数过多,请在 TrustProxies
中间件中设置代理,如下所示:
App\Http\Middleware\TrustProxies.php
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies = '*';
【讨论】:
【参考方案11】:试试这个 - 它会工作 在 RouteServiceProvider 文件中
$url = \Request::url();
$check = strstr($url,"http://");
if($check)
$newUrl = str_replace("http","https",$url);
header("Location:".$newUrl);
【讨论】:
请解释一下这里发生了什么。 需要调用exit;调用头后【参考方案12】:在您的 .env 文件中,只需使用
FORCE_HTTPS=true
这对我有用,您还可以将 APP Url 设置为 https://your-site.com 作为附加步骤
【讨论】:
【参考方案13】:我想出了如何在负载平衡的基础架构中做到这一点。
你需要添加你的 Nginx 配置:
location ~ \.php$
include snippets/fastcgi-php.conf;
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
add_header X-Forwarded-Proto https;
add_header X-Forwarded-Port 443;
add_header Ssl-Offloaded "1";
add_header Access-Control-Allow-Origin "*";
fastcgi_param HTTPS "on";
fastcgi_param HTTP_X_FORWARDED_PROTO "https";
导入器部分是 add_headers 和 pastcgi_params,它通过 AWS 负载均衡器发挥作用。
【讨论】:
不知什么原因,这是唯一对我有用的东西。HTTPS "on"
是我唯一需要添加的内容,虽然 nginx 包含类似 fastcgi_param HTTPS $https if_not_empty
的行,但它没有按预期工作,所以我不得不手动添加它并强制后端使用 HTTPS;【参考方案14】:
解决此问题的更好方法是: -> 转到公共文件夹, ->编辑.htaccess 只需在下面添加此代码:
RewriteEngine On
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]
-> 并保存。 -> 关闭并重新打开浏览器。
【讨论】:
【参考方案15】:在这个文件的类名前加上这个app\Providers\AppServiceProvider.php
use Illuminate\Support\Facades\URL;
然后将这段代码粘贴到app\Providers\AppServiceProvider.php文件的启动函数中
if (config('app.env') === 'production')
URL::forceScheme('https');
【讨论】:
【参考方案16】:这是另一个选项,这适用于 laravel 8.*。不过我不确定低版本:
将ASSET_URL
变量添加到您的.env
文件中。
例如:
ASSET_URL=https://secure-domain.com
您可以在这里找到更多信息:Laravel Helpers
提示:注意上面链接中的 cmets。
【讨论】:
【参考方案17】:仅仅使用.htaccess 文件来实现https 重定向呢?这应该放在 project root
(not in public folder)
中。您的服务器需要配置为指向项目根目录。
<IfModule mod_rewrite.c>
RewriteEngine On
# Force SSL
RewriteCond %HTTPS !=on
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
# Remove public folder form URL
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
【讨论】:
【参考方案18】:我使用的是 Apache 服务器,我认为最高效的只是更改虚拟主机配置。 改成这样
<VirtualHost *:80>
ServerName www.yourdomain.com
Redirect / https://www.yourdomain.com
</VirtualHost>
<VirtualHost _default_:443>
ServerName www.yourdomain.com
DocumentRoot /usr/local/apache2/htdocs
SSLEngine On
# etc...
</VirtualHost>
【讨论】:
以上是关于如何强制 Laravel 项目对所有路由使用 HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 4:获取 URL::route 以返回 HTTPS URL,而不在路由中强制执行 HTTPS
所有 Laravel 路由都暴露了。如果可能,如何将其移动到 app.js 或缩小