【发布时间】:2021-03-28 16:03:13
【问题描述】:
我开始使用 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 文件中,APP_URL 是 mysite.xyz
如果我通过 ssh 进入 Sai 容器并启动 artisan tinker 然后运行 route('register') 它输出 https://mysite.xyz/ 如此清晰,容器内的 laravel 应用程序似乎行为正确。
有趣的是,它在渲染html响应时,将注册路由渲染为http://localhost:8002/register
我尝试在整个项目中搜索 localhost:8002,我可以在 /storage/framework/sessions/asdofhsdfasf8as7dgf8as7ogdf8asgd7 中找到它 那段文字说: {s:3:"url";s:27:"http://localhost:8002/login";}
所以会话似乎认为它是 localhost:8002 但 tinker 认为它是 mysite.xyz
我也是一个 docker noob,所以谁知道我错过了什么。我迷路了:)
【问题讨论】:
-
您的
.env文件中的APP_URL值是什么? -
php artisan config:cache && php artisan route:cache && php artisan view:cache?你能试试这个吗 -
@onlineThomas 上面的命令不走运。在 docker 容器内,应用程序似乎知道它的名称是什么。从 docker 容器中,如果我 curl mysite.xyz/login,我会得到包含 mysite.xyz urls 的输出 html - 这是正确的。但是当我通过反向代理从主机访问该站点时,我看到 localhost:8002
标签: laravel docker nginx reverse-proxy laravel-sail