如何使用Nginx实现URL重写:将路径转为子域名形式
可以通过Nginx实现该URL格式转换
完全可以通过Nginx配置实现从www.mydomain.com/city_name/item_id/到city_name.mydomain.com/item_id/的格式转换,具体分为旧URL重定向到新格式和新子域名请求处理两部分,以下是详细配置步骤:
前提准备
首先需要确保你的域名已配置泛解析,即*.mydomain.com指向你的Nginx服务器公网IP,否则子域名无法正常访问。
1. 旧URL重定向配置
如果需要将旧格式的请求自动跳转到新的子域名格式,添加以下server块:
server { listen 80; server_name www.mydomain.com; # 匹配www.mydomain.com/city_name/item_id/格式,重定向到对应子域名 location ~ ^/([^/]+)/([^/]+)/$ { return 301 $scheme://$1.mydomain.com/$2/; } # 保留原www域名的其他业务配置 # ... }
2. 新子域名请求处理配置
配置Nginx接收所有子域名请求,并将子域名作为city_name映射到对应的目录或后端服务:
server { listen 80; server_name *.mydomain.com; # 排除主域名和www域名(避免和其他server块冲突) if ($host = mydomain.com) { return 301 $scheme://www.mydomain.com$request_uri; } if ($host = www.mydomain.com) { return 301 $scheme://www.mydomain.com$request_uri; } # 从子域名提取city_name set $city_name $host; if ($city_name ~* "^(.*)\.mydomain\.com$") { set $city_name $1; } # 示例1:静态文件场景,根目录指向对应城市的文件夹 root /var/www/html/$city_name; index index.html index.htm; # 示例2:PHP后端场景,转发请求到对应城市的项目目录 # location ~ \.php$ { # fastcgi_pass 127.0.0.1:9000; # fastcgi_param SCRIPT_FILENAME /var/www/html/$city_name$fastcgi_script_name; # include fastcgi_params; # } # 处理item_id路径的路由(根据实际业务调整) location ~ ^/([^/]+)/$ { try_files $uri $uri/ /index.html; # 静态项目用这个 # try_files $uri $uri/ /index.php?$args; # PHP项目用这个 } }
注意事项
- 如果使用HTTPS,需要申请泛SSL证书(比如Let's Encrypt的泛证书),并在listen指令中添加
443 ssl,同时配置ssl_certificate和ssl_certificate_key。 - 修改配置后,执行
nginx -t检查配置语法是否正确,无误后执行systemctl reload nginx生效配置。 - 重定向使用
301永久重定向,有利于搜索引擎优化;若仅需临时测试,可改为302临时重定向。
内容的提问来源于stack exchange,提问作者Ubo
相关产品推荐
相关产品推荐

