[英]How to serve static content in Laravel 5 over https?
我花了很多時間試圖解決這個問題,但到目前為止還沒有任何運氣。 由於混合內容錯誤,我的應用程序未加載 css(“ https://example.com/ ”上的頁面已通過 HTTPS 加載,但請求了不安全的樣式表“ http://example.com/assets/css/” magazine.min.css '。此請求已被阻止;內容必須通過 HTTPS 提供)。 我知道我可以通過將 true 傳遞給資產函數來加載資產,但這意味着我必須轉到所有資產調用並更改它們。 是否有我可以配置的站點范圍設置,以便它在生產中執行 https 並在本地執行 http?
謝謝
您可以創建類似 ForceHttps 中間件的東西,然后為其中的環境創建條件,如下所示:
public function handle($request, Closure $next)
{
if (!\App::environment('local')) {
\URL::forceSchema('https');
}
return $next($request);
}
如果需要,可以將其添加到某個路由組或全局。
注意:我建議在你的網絡服務器上解決這個問題,而不是在 Laravel
只需使用asset()
助手來生成資產的 URL。 它將使用當前協議。
不要強制通過 https 加載資產,除非它們是敏感的(幾乎從來沒有這種情況)。 這將是一種開銷,因為您通常更關心安全的網站內容而不是安全的資產。 換句話說,如果您接受加載 http 網站,則您很可能接受 http 資產。 相反,考慮使用中間件在每個非安全請求上將 http 重定向到 https。
這是我自己使用的中間件:
public function handle($request, Closure $next)
{
if (!$request->secure()) {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
如果你想使用它,請記住在附加任何 cookie 之前觸發它,即在Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse
中間件之前。
我創建了app/Helpers/SiteHelpers.php
其中包含一個覆蓋默認asset()
函數的函數。
<?php
/**
* Overrides the default asset() method, which generates an asset path for the application.
*
* @param string $path
* @param bool $secure
*
* @return string
*/
function asset ($path, $secure = null) {
if (Request::server('HTTP_X_FORWARDED_PROTO') == 'https' || Request::server('HTTPS') == 'on') {
$secure = TRUE;
}
return app('url')->asset($path, $secure);
}
然后將它添加到bootstrap/autoload.php
上面require __DIR__.'/../vendor/autoload.php';
所以它看起來像下面:
require __DIR__.'/../app/Helpers/SiteHelpers.php';
require __DIR__.'/../vendor/autoload.php';
這很靈活,具體取決於您是在 http 還是 https 上提供靜態內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.