【问题标题】:Base URL is non-www which results in routes non-www基本 URL 是非 www 导致路由非 www
【发布时间】:2021-03-13 00:25:21
【问题描述】:

我有一个通过 Nginx 反向代理在 Docker 容器中的 Nginx Web 服务器上运行的 Laravel 8 项目。

所以 DNS -> 反向代理 -> Docker Webserver 容器 -> 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,所以非万维网(obv。不使用URL::forceRootUrl(config('app.url'));) 即使我的浏览器的 URL 包含 www,所以https://www.example.com/blabla

我会说我的设置有问题,可能是我的 DNS、Nginx 反向代理或 Nginx Webserver 配置,但我无法弄清楚它是什么...... 我希望这只是一个简单的重定向修复。 我也已经重新启动了我的服务器等并完成了php artisan optimize:clear 以及config:cacheconfig: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=*
...

【问题讨论】:

  • 我曾经遇到过类似的问题,并且一切都设置正确。最后,我发现浏览器本身缓存了错误的(www 与非 www)重定向。尝试清除浏览器缓存或完全未使用的浏览器。有时它会有所帮助。
  • 谢谢,好点,但我已经用 IE(我从不使用)和同样的问题尝试过。 URL 将 example.com 记录为基本 URL,route() 缺少 www(例如 route('password.request')。我有 ofc。也已经重述了服务器等
  • 在您的 .env APP_URL 中,您有带有“www”的 url,对吧?
  • 这可能没关系,但我会将 301 重定向(非 www => www)移动到反向代理 nginx。
  • @MartinOsusky 冠军!!您可以将其发布为答案吗?将 301 重定向从我的 Nginx Web 服务器移动到我的 Nginx 反向代理就可以了!非常感谢!

标签: laravel nginx dns nginx-reverse-proxy


【解决方案1】:

解决方案是将 301 重定向从 Nginx Webserver 移动到 Nginx 反向代理(高级)。

这是配置文件的以下部分:

server {
    listen 80;
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

编辑:我怀疑它与零件有关:

proxy_set_header   Host $host;

【讨论】:

  • 太棒了!是的,这是正确的解决方案!我必须补充一点,我只是出于测试目的注释掉了端口 80 上的侦听,实际上我认为这也应该存在。也许在你的答案中更新这个!再次,非常感谢!所以是的,现在 URL() 也返回 https://www.example.com
  • 您介意将我的网站地址更改为 example.com,我忘记将其注释掉:D
  • 我仍然想知道为什么 :D 我的意思是这就像 [www or non-www] &gt; proxy [www or non-www] &gt; webserver: [non-www = www] &gt; php vs [www or non-www] &gt; proxy [non-www = www] &gt; webserver [www] &gt; php
猜你喜欢
  • 2022-01-17
  • 2018-01-04
  • 2011-06-08
  • 2017-10-06
  • 2014-12-16
  • 2011-12-18
  • 2011-06-24
  • 2019-03-09
  • 2011-11-05
相关资源
最近更新 更多