api.example.com 如何代理到 www.example.com/api/ 下?
发布于 7 年前 作者 JZLeung 5086 次浏览 来自 问答

我想要实现的结果是:

访问 api.example.com/hello/world

就相当于访问 www.example.com/api/hellp/world

这样。就是 url 看起来好看一点。

不知道在 nginx 中的配置应该需要怎么写?

24 回复

@fruit-memory URL 不能改变啊。微信那边会提示不在安全域名内。

这不就是反向代理么… nginx reverse proxy

那就试试反向代理

@thonatos 但是我用了 proxy_pass 后,会无限重定向到 /api/api/api/api/ 下。

@fruit-memory 但是我用了 proxy_pass 后,会无限重定向到 /api/api/api/api/ 下。

如果使用了 proxy_pass 后就会一直加 /api 并重定向。 image.png 这是 nginx 的配置:

server {
    listen 80;
    listen 443 ssl;
    server_name api.example.com;

    ssl_certificate fullchain.pem;
    ssl_certificate_key privkey.pem;

    access_log /var/log/nginx/api/access.log;
    error_log /var/log/nginx/api/error.log;

    location / {
        proxy_pass http://www.example.com/api/;
        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 Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
}
server {
    listen       80;
    server_name  api.example.com;
    rewrite ^/(.*) http://www.example.com/api/$1 permanent;
}

然后再写一个配置处理www.example.com 最后proxy_pass到某个端口

@fruit-memory /api/ 就是个路由。

@JZLeung 不对吗?按你给的要求就是把路由转到api下面来吗?

nginx配置url重写即可

@JZLeung
nginx 通过 host 来 match 到 server 的。 因此,你的配置需求去掉 proxy_set_header Host $host;

@JZLeung 你这个配置。。。。看看下面给你的写法吧

这个超级简单的,反向代理把api加上即可

From Noder

@JZLeung (/* and not /api/*)=> /api/*

@Gitforxuyang 重写好像不行。会无限重定向 /api/api/api/…

@hanyuzhou2006 请问下这个要具体怎么写?

@thonatos 他给的直接 rewrite 我试过了,很怪异地无限重定向了。

给 www.example.com再配置一个service啊. 你这个已经是不同的域了,感觉不适合用rewrite吧

@redky 去掉后,访问接口就这样。 image.png

@fruit-memory 你的方法可以,但是 url 会改变,微信那边好像会报错。

你这是要浏览器地址栏显示改变后的URL,只能这么做吧?微信可能是以为你改变后的URL不安全

url 重写啊!对外部是透明的 From Noder

@fruit-memory 要的是浏览器的地址栏不显示改变后的 url 才可以。

回到顶部