Как я могу применить базовую аутентификацию, только если существует файл htaccess?
Если сначала попытался поставить auth_basic
директивы в if
блокировать, но это не разрешено.
Затем я попытался перенаправить в указанное местоположение, но хотя местоположение с базовой аутентификацией работает нормально, перенаправление (которое происходит при отсутствии файла htaccess) дает сбой.
Вот как выглядит этот конфиг:
server {
listen 80;
server_name ~^(?<instance>.+?)\.foo.example.com$;
set $htaccess_user_file /var/htaccess/$instance.foo.example.com.htaccess;
if (!-f $htaccess_user_file) {
rewrite ^ @foo;
}
location / {
auth_basic "Restricted";
auth_basic_user_file $htaccess_user_file;
root /var/www/$instance.foo.example.com;
try_files $uri /index.html =404;
}
location @foo {
root /var/www/$instance.foo.example.com;
try_files $uri /index.html =404;
}
}
И вот сообщение об ошибке, которое я получаю, когда нет файла htaccess:
2013/07/12 08:37:08 [error] 32082#0:
*192 open() "/usr/html@foo" failed (2: No such file or directory),
client: 1.2.3.4, server: ~^(?<instance>.+?)\.foo.example.com$,
request: "GET / HTTP/1.1", host: "bar.foo.example.com"
У меня есть ощущение, что это связано с тем, что некоторые переменные перезаписываются указанным местоположением, но я не уверен.
Наконец, я попробовал использовать alias
в названном месте, таким образом @foo
не будет частью поискового каталога, но alias
не допускаются в названных местах .... фуууу
Это то, что MTecknology
и kolbyjack
посоветовал мне сделать на #nginx
.
server {
listen 80;
server_name ~^(?<instance>.+?)\.foo.example.com$;
root /var/www/$instance.foo.example.com;
set $htaccess_user_file /var/htaccess/$instance.foo.example.com/.htaccess;
if (!-f $htaccess_user_file) {
return 599;
}
location / {
auth_basic "Restricted";
auth_basic_user_file $htaccess_user_file;
try_files $uri /index.html =404;
}
error_page 599 = @foo;
location @foo {
root /var/www/$instance.foo.example.com;
try_files $uri /index.html =404;
}
}
Сработало безупречно!
Расширение этот ответ если у вас несколько /location
записи вам нужно переместить if
заблокировать в соответствующем месте.
worker_processes 1;
events {
worker_connections 1024;
accept_mutex off;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
upstream app_server {
server localhost:8000 fail_timeout=0;
}
server {
listen 80;
set $htaccess_user_file /etc/secrets/nginx-proxy/htaccess;
error_log stderr info;
keepalive_timeout 5;
location /static {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
autoindex off;
alias /mnt/static/;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 9;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/plain
text/css
image/x-icon
image/svg+xml
image/png
image/jpg
image/jpeg
text/js
application/javascript
application/x-javascript;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
}
location /media {
autoindex off;
alias /mnt/media/;
}
error_page 599 = @noauth;
location / {
if (!-f $htaccess_user_file) {
return 599;
}
auth_basic "Restricted";
auth_basic_user_file $htaccess_user_file;
try_files $uri @proxy_to_app;
}
location @noauth {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://app_server;
}
}
}