Nginx配置调整求助:实现www跳转非www、修复不存在路径返回500错误
问题原因说明
- www跳非www不生效:当前443端口的服务块同时绑定了
www.example.com和example.com,且80端口的跳转规则仅做了HTTP转HTTPS,没有将www域名的请求转到非www域名,导致跳转逻辑不生效。 - 不存在路径返回500错误:现有配置中所有不存在的静态资源/路径都会转发到
index.php处理,若PHP程序没有对应路由处理逻辑、或不存在的PHP文件被直接请求,都会触发PHP报错返回500,而非预期的404。
修正后的完整配置
# 80端口:统一所有HTTP请求跳转到HTTPS非www域名 server { listen 80; server_name example.com www.example.com; return 301 https://example.com$request_uri; } # 443端口www域名:所有HTTPS的www请求跳转到非www域名 server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; return 301 https://example.com$request_uri; } # 443端口主服务:处理非www域名的正常业务请求 server { listen 443 ssl; server_name example.com; root /var/www/project/; index index.php index.html index.htm index.nginx-debian.html; # 静态资源/路径匹配规则 location / { # 如果你用的是需要统一入口的PHP框架(如Laravel/ThinkPHP等),保留下面这行即可,404逻辑由框架处理 try_files $uri $uri/ /index.php$is_args$args; # 如果你是静态站点为主、不需要PHP框架路由,把上面一行注释,取消下面一行的注释,不存在的路径直接返回404 # try_files $uri $uri/ =404; } # PHP文件处理规则 location ~ \.php$ { # 新增:仅存在的PHP文件才转发给PHP-FPM处理,不存在直接返回404,避免触发500错误 try_files $fastcgi_script_name =404; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; } location ~ /\.ht { deny all; } ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
生效步骤
- 替换原有配置后,执行
nginx -t命令验证配置语法是否正确 - 验证通过后执行
systemctl reload nginx重载配置即可生效
内容的提问来源于stack exchange,提问作者UXerUIer
相关产品推荐
相关产品推荐

