求助:将.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
相关产品推荐
相关产品推荐

