12

我刚刚按照他们文档中的说明创建了一个新的 Laravel 8 项目。使用Laravel Sail,我可以在我的机器上本地运行该站点,使用sail up. 我已经设置了一个条目,/etc/hosts所以我去的网址是http://local.dev.domain.com(替换domain.com我拥有的实际域名,并指向文件localhost/etc/hosts)......一切都很好。

但是,该站点需要使用 Facebook 登录,而 Facebook 仅在推荐人上需要 https url。我已经尝试了所有可以在网上找到的关于使用 docker 设置 SSL 证书的方法,但是使用手动创建的证书(通过)设置 nginxmkcert或尝试使用 letencrypt 都因各种原因而失败(端口冲突、希望域成为真正的一个(如果我确实创建了该子域,则在 acme 挑战中失败)等等。我已将证书复制到/etc/ssl/certsdocker 映像中并运行update-ca-certificates,尝试443在我的文件中设置应用程序端口.env以及打开两个端口80和文件...但一切都以浏览器拒绝请求而告终443docker-compose.ymlhttps://local.dev.domain.com

我花了几个小时试图让它工作,但似乎没有人使用带有 SSL 的 Laravel Sail docker 图像。

任何指针?

[编辑以获取更多信息] 正如评论中指出的那样,您需要设置一个别名来使用sail ...,但我已经这样做了:

在此处输入图像描述

我也尝试不使用 bash 别名vendor/bin/sail share,但无济于事:

在此处输入图像描述

4

4 回答 4

7

问题

在您的情况下,您需要一个真实的域,您拥有该域。自签名证书不起作用,因为 Facebook 不会承认它是受信任的。要获得该域的免费 ssl 证书,您可以使用 Let's Encrypt,获得该证书的最简单方法是使用 certbot。问题是您需要在您的网络服务器上安装该证书。Laravel Sail不幸地使用了不支持 ssl的内置网络服务器。您需要在应用程序前面放置一个像 nginx 这样的网络服务器并在那里安装证书

我目前正在开发一个可以满足您需求的叉子,但它还没有完成。

解决方法

现在您可以使用 Expose 提供的内置隧道:https ://beyondco.de/docs/expose/server/ssl

这是通过启用sail share

改用ngrok可能更容易,它本质上是相同的,但商业化的。您所要做的就是下载、注册和运行ngrok http --region=eu 9000,它会为您创建一个 https 链接以进行开发。

在此处输入图像描述

于 2020-12-15T08:57:40.653 回答
4

我通过使用Caddy作为 Laravel Sail 容器的反向代理解决了这个问题。Caddy 有一个称为自动 HTTPS的功能,可以动态生成本地证书。

1 - 将 Caddy 作为服务添加到您的docker-compose.yml

services:
    caddy:
        image: caddy:latest
        restart: unless-stopped
        ports:
            - '80:80'
            - '443:443'
        volumes:
            - './docker/Caddyfile:/etc/caddy/Caddyfile'
            - sailcaddy:/data
            - sailcaddy:/config
        networks:
            - sail
            
    # Remove "ports" from laravel.test service
            
volumes:
    sailcaddy:
        driver: local

2 - 创建一个简单的Caddyfile并将其配置为反向代理

{
    on_demand_tls {
        ask http://laravel.test/caddy-check
    }
    local_certs
}

:443 {
    tls internal {
        on_demand
    }

    reverse_proxy laravel.test {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Port {server_port}
        header_up X-Forwarded-Proto {scheme}

        health_timeout 5s
    }
}

3 - 为 Caddy 设置一个端点以授权它为哪些域生成证书

<?php

namespace App\Http\Controllers;

use App\Store;
use Illuminate\Http\Request;

class CaddyController extends Controller
{
    public function check(Request $request)
    {
        $authorizedDomains = [
            'laravel.test',
            'www.laravel.test',
            // Add subdomains here
        ];

        if (in_array($request->query('domain'), $authorizedDomains)) {
            return response('Domain Authorized');
        }

        // Abort if there's no 200 response returned above
        abort(503);
    }
}

有关所涉及的完整代码更改,请参阅此要点。这篇博文解释了如何信任 Caddy 根证书。

于 2021-06-16T11:25:45.037 回答
2

要使“sail share”工作,您必须设置别名并在您的项目上运行“composer require laravel/sail --dev”。这将安装最新版本的sails,0.0.6 版包含“share”命令

于 2020-12-18T05:29:01.777 回答
-1

实际上有一个更简单的方法。我做了以下事情:

将 laravel.test 端口更改为 8085 之类的其他内容,从 .env 执行此操作,这样您就可以避免问题,添加 APP_PORT env var

然后(此步骤已由我们的系统管理员完成)由于 laravel Sai 实际是在系统中安装 apache,您可以手动将端口 80 和 443 的反向代理设置为端口 8085,这应该可以解决问题。

当然,您必须在该 apache 实例上安装 certbot。

于 2021-10-06T23:21:54.057 回答