通过 Droplet IP 访问网站(Digitalocean Droplet 中的 Laravel)工作正常,但使用注册域名显示 404

时间:2021-03-17 11:35:14

标签: php laravel nginx server digital-ocean

我在 Digitalocean Droplet 上部署了一个 Laravel 项目,并使用 NGINX 为其提供服务。

尝试通过 IP https://<Droplet_IP>/ 访问网页时一切正常(https 已启用,但未启用时,会出现同样的问题。)
但是,当我尝试通过注册域 https://<domain_name>/ 访问同一网页时,我收到了 404 error page - 这是我们制作的自定义错误页面。很奇怪。
尝试使用域访问 ANY 链接会导致 404 错误页面,同时通过 Droplet IP 访问时的相同操作就像一个魅力.

当然,我已经在 Digitalocean 中设置了 DNS 记录,包括 @www 记录。
此外,还使用 ​​Digitalocean 域名服务器 更新了域注册商上的 NS

我还经历了 NGINX 的不同配置,从互联网上尝试了各种解决方案,我最新的 NGINX 配置如下:

    server_name domain www.domain;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        #try_files $uri $uri/ /index.php?$query_string;
        try_files $uri $uri/ /index.php?$is_args$args;
        #try_files $uri $uri/ /index.php?$args;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    #error_page 404 /index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/habitoz.in/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/habitoz.in/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    if ($host = www.habitoz.in) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = habitoz.in) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name domain www.domain;
    #return 404; # managed by Certbot

}


现在,我不知道该怎么办。
网站如何通过 IP 而不是通过域完美运行。
而且,如果首先出现域问题,自定义 404 页面是如何显示的。
这意味着应用程序正在运行,但不知何故,通过域访问时出现问题。

1 个答案:

答案 0 :(得分:0)

花了一整天的时间,还是想不出答案。当我早上醒来时,答案在我心中响起。
结果证明这是一个非常简单且愚蠢的错误!

当我在 droplet 中部署应用程序时,我修改了 let obj2={} let obj1= {key3:[9938,33,0,39,2],key1:[1,2,3],key2:[333,11]} Object.keys(obj1) .sort((a,b)=>{ if (obj1[a].length>obj1[b].length) { return -1 } if (obj1[a].length<obj1[b].length) { return 1 } return 0 }) .map(x=>{ obj2[x]=obj1[x] }) console.log(obj2); 文件,并将 .env 更改为 APP_URL 但是当我将 droplet 链接到域时,我跳过了更改APP_URL,这是一件小事,我不记得我跳过了那一步。
我所有的错误检查和尝试不同的解决方案都无济于事,但检查 <Droplet_IP> 文件并没有让我感到震惊。
一旦 .env 被修改为指向正确的 URL,错误就消失了。