Nginx:Basic_auth 已设置并正常运行,但所有受保护的页面都返回 404

Nginx:Basic_auth 已设置并正常运行,但所有受保护的页面都返回 404

我已经在网站上的某些页面上设置了基本身份验证。服务器日志显示身份验证正在运行,但是,一旦我登录,所有受保护的页面都会返回 404 错误 - 而且不是我实际的 404 页面,而是通用的 Nginx 404 页面。

这是在 Heroku 上运行的 Django 应用。在我禁用了基本身份验证的开发服务器上,页面加载正常,因此我的路由没有任何问题。

这是我的 nginx.conf.erb:

daemon off;
#Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;

events {
    use epoll;
    accept_mutex on;
    worker_connections 1024;
}

http {

    gzip on;
    gzip_comp_level 2;
    gzip_min_length 512;

    server_tokens off;

    include mime.types;
    default_type application/octet-stream;
    sendfile on;

    client_body_timeout 5;

    upstream app_server {
        server unix:/tmp/nginx.socket fail_timeout=0;
    }

    server {
        listen <%= ENV["PORT"] %>;
        server_name _;
        keepalive_timeout 5;

        root /app;

        location / {

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://app_server;

        }

        location /protected {

            try_files $uri $uri/ =404;

            auth_basic "Restricted";
            auth_basic_user_file /app/config/.htpasswd;
        }
    }
}

这是我登录后尝试访问受保护的页面时的日志输出:

2018-06-19T06:58:10.612050+00:00 heroku[router]: at=info method=GET path="/protected/" host=mysite.com request_id=fe3aedbc-f31b-4012-9084-6ec7c194583d fwd="183.89.28.135,172.68.6.102" dyno=web.1 connect=1ms service=2ms status=404 bytes=707 protocol=https

2018-06-19T06:58:10.611886+00:00 app[web.1]: measure#nginx.service=0.001 request="GET /protected/ HTTP/1.1" status_code=404 request_id=fe3aedbc-f31b-4012-9084-6ec7c194583d remote_addr="10.158.185.56" forwarded_for="183.89.28.135, 172.68.6.102" forwarded_proto="https" via="1.1 vegur" body_bytes_sent=564 referer="-" user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.25 Safari/537.36"

答案1

您可能需要proxy_pass在第二个location块内重复:

location /protected {
    try_files $uri $uri/ =404;
    proxy_pass http://app_server; # add this line

    auth_basic "Restricted";
    auth_basic_user_file /app/config/.htpasswd;
}

我遇到过与你类似的配置的相同问题。为了调查此问题,我打开了 nginx 日志 ( tail -f /var/log/nginx/error.log)。在那里,我看到了几个open() "/usr/share/nginx/html/my/endpoint/path" failed (2: No such file or directory)– 这表明 nginx 不会在没有明确的情况下执行反向代理代理密码在每个位置块中。

答案2

在我的情况下,出现 404 是因为我的根目录恢复为默认目录。对于 Debian,我认为默认根目录是 /usr/share/nginx/html

location ... {
  # Forgot to set the root...
  root /home/www-data/example.com/restricted;
  auth_basic "Restricted Area";
  auth_basic_user_file thepass;
}

我可能已经将这个位置块嵌套在主位置块(我有根集的地方)内,但决定像这样将其分开......

相关内容