简介:本文详细介绍Nginx中rewrite模块的域名跳转配置方法,涵盖基础语法、常用场景、性能优化及安全注意事项,通过代码示例和场景分析帮助开发者高效实现HTTP/HTTPS域名重定向。
Nginx的rewrite模块通过正则表达式匹配请求URI,并基于匹配结果修改请求路径或重定向到新地址。其核心指令rewrite的语法结构为:
rewrite regex replacement [flag];
server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;}
关键点:
return 301比rewrite性能更高$host变量自动获取请求域名$request_uri包含查询参数
server {listen 80;server_name old-domain.com;rewrite ^/(.*)$ https://new-domain.com/$1 permanent;}
优化建议:
permanent标志返回301状态码(SEO友好)(.*)捕获所有路径redirect(302)避免缓存问题
server {listen 80;server_name example.com;# 仅对移动端UA重定向if ($http_user_agent ~* "(android|iphone|ipad)") {rewrite ^/app(.*)$ https://m.example.com$1 permanent;}# 其他请求保持原样location / {# ...原有配置}}
注意事项:
if指令在Nginx中性能较低,建议仅在必要时使用map模块替代复杂条件判断
http {map $host $redirect_url {default "";old1.example.com "https://new1.example.com";old2.example.com "https://new2.example.com";~^www\.(.*) "https://$1";}server {listen 80;server_name ~^(.*)$;if ($redirect_url) {return 301 $redirect_url$request_uri;}}}
优势:
贪婪匹配问题:.*可能导致意外匹配
# 不推荐(可能匹配过多)rewrite ^/(.*)$ /new/$1;# 推荐(明确边界)rewrite ^/([^/]+)(/.*)?$ /new/$1$2;
last标志减少内部重写次数
rewrite ^/old-path(.*)$ /new-path$1 last;
server {rewrite_log on; # 开启rewrite日志error_log /var/log/nginx/rewrite.debug debug;location / {rewrite ^/test(.*)$ /new$1;# 其他配置...}}
调试步骤:
curl -v查看响应头严格验证$host变量
server {listen 80;server_name ~^(www\.)?(example\.com)$;if ($host !~ "^(www\.)?example\.com$") {return 444; # 关闭非法域名的连接}}
确保重定向后使用HSTS
server {listen 443 ssl;server_name example.com;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# ...其他SSL配置}
需求:将shop.old-domain.com所有流量跳转到new-domain.com/store
解决方案:
server {listen 80;server_name shop.old-domain.com;# 保留查询参数rewrite ^/store(.*)$ https://new-domain.com/store$1 permanent;rewrite ^/(.*)$ https://new-domain.com/store/$1 permanent;}
需求:根据Accept-Language头跳转到对应语言版本
解决方案:
map $http_accept_language $lang {default en;~^zh-CN zh-CN;~^ja ja;}server {listen 80;server_name example.com;if ($lang != "en") {rewrite ^/(.*)$ https://$lang.example.com/$1 permanent;}}
Q1:rewrite和return的区别?
return直接返回状态码,性能更高rewrite可以进行URI修改和内部重定向Q2:如何测试跳转配置?
curl -I http://example.com查看响应头Q3:跳转后丢失POST数据怎么办?
return 301而非rewrite通过合理配置Nginx的rewrite模块,可以高效实现各种域名跳转需求,同时需兼顾性能、安全性和可维护性。建议在实际部署前进行充分测试,并监控跳转后的流量变化。