Ubuntu 16.04 和 Ubuntu 18.04 的示例

Ubuntu 16.04 和 Ubuntu 18.04 的示例

这是我的 nginxproxy.conf文件,

server {
    listen port 9090;
    root /usr/share/nginx/html; # not sure whether this line is needed or not
    index index.html; # not sure whether this line is needed or not
    location / {
        proxy_pass http://google.com
    }
}

我正在尝试隐藏原始网站地址,例如google.com在我的后面localhost:9090

但是,当我使用此文件启动 nginx 服务并在浏览器中proxy.conf输入时,它会正确地将我重定向到,但它会在浏览器中显示 URL 。localhost:9090google.comgoogle.com

我在这里看到了一些问题如何使用 Nginx 反向代理隐藏后端 URL/URI ,但我并没有得到我的问题的答案。

如果您需要有关此问题的任何附加信息,请在评论中提问。我愿意提供任何信息,只要这些信息能帮我解决问题。

答案1

Ubuntu 16.04 和 Ubuntu 18.04 的示例

向浏览器返回硬重定向(301)或临时重定向(302 或更新的 303)的后端(浏览器执行它们)很容易将用户从您的 Nginx 上带走。这可以用 Lua 拦截。

我在这里展示的内容至少在法律上处于灰色地带,但对于 Google 来说却是黑色地带。不要将其投入生产!无论如何,Google 附加到请求中的所有安全标头都会破坏您的乐趣。

安装

# sudo apt purge nginx-*  # maybe necessary, backup your /etc/nginx/… configs before!
sudo add-apt-repository ppa:nginx/stable
sudo apt-cache show nginx-extras | grep -P '((xenial)|(bionic))'
sudo apt install nginx-extras  # Lua support (nginx-extras is > nginx-full)

配置

/etc/nginx/sites-available/test.conf

server
{
    listen 80;
    listen [::]:80;

    server_name niegit.com;

    # Nginx vs. Lua
    #
    # Comment: # vs. --
    # Concat: NIL vs. ..
    # $request_uri vs. ngx.var.request_uri  # path with query string
    # $is_args$args vs. ngx.var.is_args .. ngx.var.args  # query string
    # $1 vs. ngx.var[1]  # regex capturing group 1
    # $2 vs. ngx.var[2]  # regex capturing group 2

    location /
    {
        rewrite_by_lua_block
        {
            -- Probs with AJAX/XHR and/or Websockets!
            ngx.log(ngx.ALERT, 'See this text in /var/log/nginx/error.log')
            local map = {
                GET = ngx.HTTP_GET,
                POST = ngx.HTTP_POST,
            }
            ngx.req.read_body()
            local res = ngx.location.capture('/location_2' .. (ngx.var.request_uri or ''), {
               method = map[ngx.var.request_method],
               body = ngx.var.request_body
            })

            -- Detect/change redirect...
            local redirect_target = res.header.Location
            if redirect_target and res.status > 300 and res.status < 309 then
                ngx.log(ngx.ALERT, redirect_target)
                local redirect_target_changed, n, err = ngx.re.gsub(redirect_target, 'https?[:]//(?:www[.])?google[.]com(?:[:][0-9]*)?', 'http://niegit.com')
                ngx.log(ngx.ALERT, redirect_target_changed)
                return ngx.redirect(redirect_target_changed, 303)
            else
                ngx.exec('@named_location_3')
                return ngx.exit(ngx.HTTP_OK)
            end
        }
    }

    location /location_2
    {
        proxy_pass https://www.google.com/;
    }

    location @named_location_3
    {
        proxy_pass https://www.google.com$request_uri;
    }
}

启用

cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/test.conf test.conf
sudo nginx -t
sudo service nginx reload  # or newer: sudo systemctl reload nginx

如果没有sites-availablesites-enabled文件夹,只需放入test.conf您的conf.d文件夹即可。

测试

curl -I niegit.com  # not active at the moment

如果您在自己的域下提供外部后端,这应该只用于测试目的,或者您询问所有者。这里显示的示例当然可以合法地用于您自己的后端并节省您的时间。;)

相关内容