You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 规则应用到所有站点的方法

把通用规则抽成独立配置片段即可批量复用:

  1. 创建通用规则文件/etc/nginx/snippets/common-rewrite.conf,把除了域名、SSL证书、站点根目录之外的通用重写规则都放进去
  2. 每个站点的server块中添加一行include snippets/common-rewrite.conf;即可复用所有规则,不需要重复编写
  3. 最上方的80端口default_server配置已经是全局生效,只要没有其他站点单独监听80端口,就会自动对所有站点执行HTTP转HTTPS逻辑

内容的提问来源于stack exchange,提问作者Radial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:24:00