我在 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 页面是如何显示的。
这意味着应用程序正在运行,但不知何故,通过域访问时出现问题。
答案 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,错误就消失了。