Nginx自定义301跳转页面失效,如何替换默认Nginx页面?
解决Nginx 301自定义页面不生效的问题
首先得搞清楚为什么你的自定义301页面没起作用:你当前用的return 301 https://$server_name$request_uri;是Nginx的快捷返回指令,它会直接生成包含默认Nginx页面的301响应,完全不会触发你配置的error_page 301规则,所以你的自定义页面根本没被加载。
下面给你两种可行的解决方案,选一种适合你的:
方案一:用rewrite替代return并调整error_page配置
这种方法不需要改动太多现有配置,只需要替换server块里的return指令,并微调error_page的规则:
- 先修改你的
error_pages.conf里的301规则,加上状态码标记,确保Nginx返回301状态码的同时使用自定义页面:
error_page 301 =301 /error/301.html; # 其他error_page配置保持不变...
- 把server块里的
return 301 https://$server_name$request_uri;替换成rewrite指令:
server { listen 80; server_name ourhost.com; include /etc/nginx/snippets/error_pages.conf; # 用rewrite触发301跳转,同时让error_page生效 rewrite ^ https://$server_name$request_uri? permanent; location ^~ /error/ { internal; root /usr/share/nginx/html; # 手动添加Location头,确保跳转正常 add_header Location https://$server_name$request_uri; } }
方案二:通过触发错误+自定义变量传递跳转地址
这种方法更灵活,适合需要统一管理跳转逻辑的场景:
- 修改
error_pages.conf中的301规则和error location:
error_page 301 /error/301.html; # 其他error_page配置保持不变... location ^~ /error/ { internal; root /usr/share/nginx/html; # 返回301状态码,并从自定义变量获取跳转地址 return 301 $redirect_url; }
- 更新server块的配置,用自定义变量传递跳转地址并触发301错误:
server { listen 80; server_name ourhost.com; include /etc/nginx/snippets/error_pages.conf; # 定义跳转地址变量 set $redirect_url https://$server_name$request_uri; # 触发301错误,让error_page接管响应 return 301; }
验证配置
修改完配置后,记得执行nginx -t检查配置是否合法,然后用systemctl reload nginx(或对应重启命令)生效配置。之后访问http://ourhost.com,就能看到自定义的301页面了,同时跳转功能正常,也不会暴露Nginx的信息。
内容的提问来源于stack exchange,提问作者orion3
相关产品推荐
相关产品推荐

