重写Nginx中的URL以仅重定向到路径名

时间:2014-07-01 18:29:21

标签: nginx url-rewriting

我正在尝试允许只有内部网访问权限的用户使用Nginx访问互联网上的单个网站。我当前的nginx配置是

 server {
 listen aproxy.com:80;
 rewrite_log on;
 location ~ ^/bproxy {
 if ($args != "")
 {
    return 302 http://$args;
 }

这允许我从aproxy.com/bproxy?www.somewebsite.com重定向到www.somewebsite.com,但将URL显示为www.somewebsite.com。我希望能够将用户从aproxy.com/bproxy/www.somewebsite.com(而不是args)发送到www.somewebsite.com,而不会在URL栏中看到更改。有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用proxy_pass代替return

location ~ ^/bproxy/(.*) {
    resolver        8.8.8.8;  #set DNS resolver (by Google) to prevent "no resolver defined to resolve <domain>" error
    proxy_pass      http://$1;
}

但请记住,如果远程页面包含类似

的链接
<a href="some-path">Link</a>

链接网址变为

http://aproxy.com/bproxy/some-path

<a href="/some-path">Link</a>

变为

http://aproxy.com/some-path

页面中的任何资源(图像,js,css等)都是如此,因此网页的行为可能会被破坏。

也许你应该摆脱/bproxy路径,让完整的aproxy.com域自己成为代理。

<强>更新

您也可以尝试使用server_name指令:

server {
    listen         127.0.0.1:80;
    server_name    aproxy.com;
    #...
}

更新2 - 仅代理特定网站的服务器(不支持https):

server {
    listen          127.0.0.1:80;
    server_name     aproxy.com;

    location / {
        resolver        8.8.8.8;
        proxy_pass      http://stackoverflow.com;
    }
}

因此,浏览到http://aproxy.com/questions,您得到与http://stackoverflow.com/questions

相同的结果

注意:

如果您希望在本地网络中显示此代理,请将127.0.0.1替换为服务器的本地IP(可能类似于192.168.1.10