5

我开始使用 nginx 反向代理测试新的 Laravel Sail docker-compose 环境,这样我就可以在本地机器上开发时从真实的 tld 访问我的网站。

我的设置是:操作系统 - 安装了 nginx 和 docker 的 Ubuntu Desktop 20。

在主机上启用 Nginx 站点:

server {

        server_name mysite.xyz;

        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/ssl/certs/mysite.xyz.crt;
        ssl_certificate_key /etc/ssl/private/mysite.xyz.key;
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

        location / {
                proxy_pass http://localhost:8002;
        }

}

我的主机 /etc/hosts 文件中还有127.0.0.1 mysite.xyz

还有我的 docker-compose:

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '8002:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local

当我从主机访问 mysite.xyz 时,网站加载正常。

我遇到的问题是,在我可以通过访问注册页面( https://mysite.xyz/register )从我的主机上看到的注册页面上,表单操作是:http://localhost:8002/register

生成上述 url 的代码是<form method="POST" action="{{ route('register') }}">

这是一个问题,因为我没有从 localhost:XXXX 访问该站点,而是从 mysite.xyz 访问该站点,该站点通过 nginx 反向代理并最终指向 http://localhost:8002/register **

我检查了什么:

在我的 Laravel .env 文件中,如果我 ssh 进入 Sai 容器并启动 artisan tinker 然后运行route('register')它,那么 APP_URL 是 mysite.xyz 输出https://mysite.xyz/ 如此清晰,容器内的 laravel 应用程序似乎是行为正确。

有趣的是,当它渲染 html 响应时,它会将注册路由渲染为http://localhost:8002/register

我尝试在整个项目中搜索 localhost:8002,我可以在 /storage/framework/sessions/asdofhsdfasf8as7dgf8as7ogdf8asgd7 中找到它,那段文字显示:{s:3:"url";s:27:"http://localhost: 8002/登录";}

所以似乎会话认为它是 localhost:8002 但修补匠认为它是 mysite.xyz

我也是一个码头菜鸟,所以谁知道我错过了什么。我迷路了 :)

4

1 回答 1

1

“问题”在于您的 nginx 配置,而不是您的代码:

proxy_pass http://localhost:8002;

Laravel 在 CLI(控制台)中或在您​​使用时config('app.url')env('APP_URL')在代码中使用 APP_URL。对于所有其他操作(例如通过路由助手构建 URL),Laravel 从请求中获取 URL:

URL 生成,Laravel 8.x 文档

url helper 可用于为您的应用程序生成任意 URL。生成的 URL 将自动使用应用程序正在处理的当前请求中的方案(HTTP 或 HTTPS)和主机。

您需要做的是在您的 nginx 配置中传递正确的 URL 和端口,方法是添加:

proxy_pass http://localhost:8002;
proxy_set_header Host $host;

有关该主题的更多信息,您可能需要查看这篇文章:设置 Nginx 反向代理

于 2021-05-15T01:57:06.597 回答