Base URL 是非 www 导致路由非 www
Base URL is non-www which results in routes non-www
我通过 Nginx 反向代理在 Docker 容器中的 Nginx Web 服务器上有一个 Laravel 8 项目 运行。
所以 DNS -> 反向代理 -> Docker Web 服务器容器 -> PHP-FPM 容器
问题是,当我使用 Laravel 的 route()
时,它 缺少 www 导致无法登录(以及资产等) ).
因为我在 www 域上(因为 Nginx 重定向)但路由端点不是 www(所以我相信是不同的站点,令牌问题)。
在我的 .env 中,我设置了 APP_URL,我认为它仅适用于 CLI 命令,此外我还设置了 ASSET_URL,它适用于 asset()
函数。如果问题的根源(我的设置)正确(显然不正确),我不必使用 ASSET_URL。
我可以通过在我的路由器中使用 URL::forceRootUrl(config('app.url'));
来绕过这个问题,这会强制我的 .env 中设置的 APP_URL 用于 RouteUrlGenerator
(我相信)
\URL::to('/')
的输出是 https://example.com,所以是非 WWW(没有使用 URL::forceRootUrl(config('app.url'));
)
尽管我的浏览器 URL 包含 www,所以 https://www.example.com/blabla.
我会说我的设置有问题,无论是我的 DNS、Nginx 反向代理还是 Nginx 网络服务器配置,但我无法弄清楚它是什么...
我希望这只是一个简单的重定向修复。
我也已经重新启动了我的服务器等并完成了 php artisan optimize:clear
以及 config:cache
和 config:clear
以确保。
请在下面找到我的配置:
通过 CloudFlare 的 DNS(代理):
A example.com 123.123.123.123 Proxied
A www 123.123.123.123 Proxied
CNAME * example.com DNS Only
我的 Nginx 反向代理 配置:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://localhost:8012;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
我的 Nginx 网络服务器 配置:
server {
# listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
# listen 80 default_server;
index index.html index.htm index.php;
server_name www.example.com;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9012;
fastcgi_index index.php;
include fastcgi_params;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/$fastcgi_script_name;
# fastcgi_param SCRIPT_FILENAME $document_root/example.com.au/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
# Support Clean (aka Search Engine Friendly) URLs & enable Gzip compression:
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
我的“默认”Laravel 8 .htaccess:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
我的.env:
APP_NAME=SomeSite.com
APP_ENV=production
APP_KEY=base64:sdljkldasjkasjasdjklaslkasd
APP_DEBUG=true
APP_URL=https://www.example.com#Used for CLI function such as artisan...
#ASSET_URL=https://asseturl.test#Only used in asset()
TRUSTPROXIES=*
...
解决方案是将 301 重定向从 Nginx Webserver 移动到 Nginx Reverse Proxy(高级)。
这是配置文件的以下部分:
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
编辑:我怀疑它与以下部分有关:
proxy_set_header Host $host;
我通过 Nginx 反向代理在 Docker 容器中的 Nginx Web 服务器上有一个 Laravel 8 项目 运行。
所以 DNS -> 反向代理 -> Docker Web 服务器容器 -> PHP-FPM 容器
问题是,当我使用 Laravel 的 route()
时,它 缺少 www 导致无法登录(以及资产等) ).
因为我在 www 域上(因为 Nginx 重定向)但路由端点不是 www(所以我相信是不同的站点,令牌问题)。
在我的 .env 中,我设置了 APP_URL,我认为它仅适用于 CLI 命令,此外我还设置了 ASSET_URL,它适用于 asset()
函数。如果问题的根源(我的设置)正确(显然不正确),我不必使用 ASSET_URL。
我可以通过在我的路由器中使用 URL::forceRootUrl(config('app.url'));
来绕过这个问题,这会强制我的 .env 中设置的 APP_URL 用于 RouteUrlGenerator
(我相信)
\URL::to('/')
的输出是 https://example.com,所以是非 WWW(没有使用 URL::forceRootUrl(config('app.url'));
)
尽管我的浏览器 URL 包含 www,所以 https://www.example.com/blabla.
我会说我的设置有问题,无论是我的 DNS、Nginx 反向代理还是 Nginx 网络服务器配置,但我无法弄清楚它是什么...
我希望这只是一个简单的重定向修复。
我也已经重新启动了我的服务器等并完成了 php artisan optimize:clear
以及 config:cache
和 config:clear
以确保。
请在下面找到我的配置:
通过 CloudFlare 的 DNS(代理):
A example.com 123.123.123.123 Proxied
A www 123.123.123.123 Proxied
CNAME * example.com DNS Only
我的 Nginx 反向代理 配置:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
location / {
proxy_pass http://localhost:8012;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
我的 Nginx 网络服务器 配置:
server {
# listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
# listen 80 default_server;
index index.html index.htm index.php;
server_name www.example.com;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9012;
fastcgi_index index.php;
include fastcgi_params;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /var/www/example.com/public/$fastcgi_script_name;
# fastcgi_param SCRIPT_FILENAME $document_root/example.com.au/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
# Support Clean (aka Search Engine Friendly) URLs & enable Gzip compression:
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
我的“默认”Laravel 8 .htaccess:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
我的.env:
APP_NAME=SomeSite.com
APP_ENV=production
APP_KEY=base64:sdljkldasjkasjasdjklaslkasd
APP_DEBUG=true
APP_URL=https://www.example.com#Used for CLI function such as artisan...
#ASSET_URL=https://asseturl.test#Only used in asset()
TRUSTPROXIES=*
...
解决方案是将 301 重定向从 Nginx Webserver 移动到 Nginx Reverse Proxy(高级)。
这是配置文件的以下部分:
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
编辑:我怀疑它与以下部分有关:
proxy_set_header Host $host;