Laravel + Nginx + Basic Auth:如何让一些路由不受保护?

Laravel + Nginx + Basic Auth: how to leave some routes unprotected?

我们有 Nginx 并用它来服务 Laravel 8 项目

我需要使用基本授权来保护这个演示项目。

有效,使用 nginx 和 auth_basic_file 指令

auth_basic            "My DEMO";

location ~ ^/(api|public|images)/.* {
    auth_basic off;
    try_files   $uri $uri/ /index.php?$query_string;
}



location ~ \.php$ {

    # Protect access
    auth_basic_user_file  /etc/nginx/auth/.htpasswd;

    add_header      X-Dovesono-php 1;
    fastcgi_pass    unix:/run/php/php7.4-fpm.sock;
    fastcgi_index   index.php;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param   PATH_INFO $fastcgi_path_info;
}

我的目标

我需要让 /api/ 的整个块不受保护

问题

实际上,使用上面的配置,浏览器要求我在每次 ajax 调用 /api/ 时进行身份验证。 此外,即使输入正确的用户名和密码,它也会无限期地重新询问

我决定使用这个:

server {
   ....
   auth_basic_user_file /etc/nginx/auth/.htpasswd;

  location / {
    auth_basic   "My DEMO";
    try_files    $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    ... ...
  }

  location /api/ {
    auth_basic   off;
    try_files    $uri /index.php?$query_string;
  }

}

如果首先匹配/api/,则没有设置身份验证,然后导致重新开始解析,将使用location ~ \.php$结束。

因此页面已提供,但没有询问 http 基本身份验证

对于所有其他路由,它应用 auth_basic,然后导致重新开始解析,最终使用 location ~ \.php$

因此页面已提供,但要求 http 基本身份验证