从 Nginx 密码验证中排除一个目录

Exclude one directory from Nginx password authentication

我已将我的 Nginx 服务器设置为对所有内容进行身份验证,但我想排除 /var/www/html/t/sms/plivo 下的所有文件以进行密码身份验证。我曾尝试使用不同的路径,但当我尝试从浏览器访问 /var/www/html/t/sms/plivo 下的文件时,它总是要求输入密码。

下面是我的/etc/nginx/sites-available/default文件

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

        root /var/www/html;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

        auth_basic "Private Property";
        auth_basic_user_file /etc/nginx/.htpasswd;

        #no password for the plivo folder so we can recieve messages!
        location = /t/sms/plivo/ {
                auth_basic off;
                allow all; # Allow all to see content
        }

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

location = 语法匹配一个 URI 而不是它下面的所有 URI。此外,您应该使用 ^~ 修饰符来防止正则表达式 location 块干扰。有关 location 个块的评估顺序的规则,请参阅 this document

如果您在 /t/sms/plivo/ 下有任何 PHP 文件,您将需要添加一个嵌套的位置块来处理这些文件。

例如:

location ^~ /t/sms/plivo/ {
    auth_basic off;
    allow all; # Allow all to see content

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}

location ~ \.php$ 块是您配置中已有的同名块的补充。而且,您可能不需要 allow all 语句,除非您有一些我看不到的 deny 规则。

希望它能对任何人有所帮助 - 我们必须跳过 url 下所有 uri 的身份验证,所以

location ^~ /some/location/to_skip/ {
  auth_basic off;
  try_files $uri $uri/ /index.html;
}