簡體   English   中英

如何通過 https 在 Laravel 5 中提供靜態內容?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM