Apache转Nginx rewrite规则转换、全局配置及未解决问题求助
Apache Rewrite 规则对应 Nginx 完整实现方案
1. 完整等效配置
# 全局HTTP转HTTPS,适用所有站点 server { listen 80 default_server; server_name _; return 301 https://$host$request_uri; } # 单站点配置示例,所有站点可复用该逻辑 server { # 监听www域名的443请求,直接跳转到非www主域名 listen 443 ssl; server_name www.example.com; ssl_certificate /etc/ssl/nginx-ssl/bundle.crt; ssl_certificate_key /etc/ssl/nginx-ssl/example.key; return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/nginx-ssl/bundle.crt; ssl_certificate_key /etc/ssl/nginx-ssl/example.key; root /var/www/example.com/html; index index.html; access_log /var/log/nginx/nginx.vhost.access.log; error_log /var/log/nginx/nginx.vhost.error.log; # 移除.html后缀跳转,此处将你原有配置的302临时跳转改为301永久跳转,和原Apache规则保持一致,更利于SEO if ($request_uri ~ ^/(.*)\.html(\?|$)) { return 301 /$1$is_args$args; } # 移除/index后缀跳转 if ($request_uri ~ ^/(.*)/index(\?|$)) { return 301 /$1/$is_args$args; } # 解决问题1:非目录路径自动移除末尾斜杠 if (!-d $request_filename) { rewrite ^/(.*)/$ /$1 permanent; } # 解决问题2:用户无感知转发请求到对应html文件 location / { try_files $uri $uri.html $uri/ =404; } }
2. 核心逻辑说明
- 非目录移除末尾斜杠:通过
!-d $request_filename判断请求路径不是真实目录,再执行rewrite移除末尾斜杠,不会影响正常目录的访问规则 - 无感知转发到html文件:
try_files规则会在用户访问/xxx时,自动匹配根目录下的xxx.html文件直接返回内容,地址栏不会发生变化,也不会产生跳转记录,完全符合搜索引擎友好的要求
3. 规则应用到所有站点的方法
把通用规则抽成独立配置片段即可批量复用:
- 创建通用规则文件
/etc/nginx/snippets/common-rewrite.conf,把除了域名、SSL证书、站点根目录之外的通用重写规则都放进去 - 每个站点的server块中添加一行
include snippets/common-rewrite.conf;即可复用所有规则,不需要重复编写 - 最上方的80端口default_server配置已经是全局生效,只要没有其他站点单独监听80端口,就会自动对所有站点执行HTTP转HTTPS逻辑
内容的提问来源于stack exchange,提问作者Radial
相关产品推荐
相关产品推荐

