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

求助:将.htaccess中的RewriteCond重写规则块转换为NGINX配置

把Apache .htaccess规则转成Nginx配置的解决方案

嘿,先帮你揪出原规则里的一个明显笔误——你写的那行RewriteRule ^(RewriteRule ^(api/.*)$ https://lp.domain.nl/$1 [P]肯定是复制粘贴错了,应该改成RewriteRule ^(api/.*)$ https://lp.domain.nl/$1 [P],不然Apache根本没法正常解析这行规则。

接下来是对应的Nginx配置,我尽量贴合原规则的逻辑,而且用Nginx更推荐的方式来实现(尽量少用if,用location块匹配路径,效率更高):

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.domain.nl;

    # 匹配_next/开头的路径,反向代理到lp.domain.nl
    location ~ ^/_next/(.*)$ {
        proxy_pass https://lp.domain.nl/_next/$1;
        # 这些代理头是可选但推荐的,确保后端能拿到真实的请求信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 处理assets/next/前缀的路径
    location ~ ^/assets/next/(.*)$ {
        proxy_pass https://lp.domain.nl/assets/next/$1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 匹配lp2/开头的路径
    location ~ ^/lp2/(.*)$ {
        proxy_pass https://lp.domain.nl/lp2/$1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 精确匹配/advice/welcome这个路径(和原规则逻辑一致)
    location = /advice/welcome {
        proxy_pass https://lp.domain.nl/advice/welcome;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 匹配api/开头的路径——注意这个会被下面的api/v1/覆盖,因为Nginx优先匹配更长的前缀/更精确的规则
    location ~ ^/api/(.*)$ {
        proxy_pass https://lp.domain.nl/api/$1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 匹配api/v1/开头的路径,优先级比上面的/api/高,和原规则逻辑一致
    location ~ ^/api/v1/(.*)$ {
        proxy_pass https://app.domain.nl/api/v1/$1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

几个关键细节说明:

  • Nginx的location匹配逻辑:=用于精确匹配(比如/advice/welcome),~是区分大小写的正则匹配;而且Nginx会优先匹配更长、更精确的规则,所以/api/v1/会比/api/先触发,和原Apache规则按顺序匹配的结果一致。
  • 原Apache里的[P] flag就是反向代理的意思,对应Nginx的proxy_pass指令。
  • 那些proxy_set_header是用来把原始请求的主机、IP、协议等信息传给后端服务器的,很多应用依赖这些信息来正常工作,建议加上。
  • 原规则里的[NC](不区分大小写),如果你的路径需要不区分大小写匹配,可以把正则匹配改成~*(比如location ~* ^/_next/(.*)$),不过一般路径都是区分大小写的,按需调整就行。

如果你的Nginx配置里已经有针对www.domain.nl的server块了,直接把这些location块加进去就行,不用新建整个server块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:47:35