Назад | Перейти на главную страницу

Применять блокировку местоположения к запросам псевдонимов только для запросов HTTP GET

У меня есть веб-приложение, доступ к которому осуществляется через nginx, который действует как обратный прокси. Однако подпуть этого приложения является псевдонимом каталога. Конфигурация сервера следующая:

server {
    # ...

    location /myapp/files {
      alias /var/www/myapp/files;
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/htpasswd;
    }

    location /myapp/ {
      proxy_pass http://127.0.0.1:3000/;
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/htpasswd;
    }
}

Приведенная выше настройка псевдонимов всех запросов /myapp/files независимо от метода запроса. Есть ли способ использовать псевдоним только для запросов GET для /myapp/files, и проксировать метод DELETE в веб-приложение?

Ограничения если предотвратите написание чего-то вроде этого:

if ($request_method = "GET") {
    location /myapp/files {
      alias /var/www/myapp/files;
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/htpasswd;
    }
}

Как было предложено в комментариях, пытаясь сделать что-то вроде этот с моей конфигурацией:

location /myapp/files {
    auth_basic Restricted;
    auth_basic_user_file /etc/nginx/htpasswd;

    if ($request_method = "GET") {
      alias /var/www/myapp/files;
    }

    if ($request_method = "DELETE") {
      proxy_pass http://127.0.0.1:3000/;
    }
  }
}

приводит к:

nginx: [emerg] "alias" directive is not allowed here in /etc/nginx/sites-enabled/default:44

Как я могу этого добиться?

Попробуйте использовать серию внутренних перезаписей (не тестировалось, написано прямо в браузере):

location /myapp/files {
  auth_basic "Restricted";
  auth_basic_user_file /etc/nginx/htpasswd;
  rewrite ^(/myapp/files)(.*) $1.$request_method$2 break;
}

location /myapp/files.GET {
  alias /var/www/myapp/files;
  internal;
}

location /myapp/files.DELETE {
  rewrite ^/myapp(/files)(.*) $1$2 break;
  proxy_pass http://127.0.0.1:3000/;
  internal;
}