У меня есть сайт, работающий на Nginx (v1.0.14), служащий обратным прокси-сервером, который передает запросы к Apache (v2.2.19). Итак, Nginx работает на порту 80, Apache - на 8080.
В целом сайт работает нормально, за исключением того, что я не могу заблокировать доступ к определенным каталогам с помощью файла .htaccess.
Например, у меня есть «my-protected-directory» на «www.site.com». Внутри у меня есть htaccess со следующим кодом:
<Files *>
order deny,allow
deny from all
allow from 1.2.3.4 <--- my ip address here
</Files>
Когда я пытаюсь получить доступ к этой странице с помощью своего ip (1.2.3.4), я получаю ошибку 404, чего я не ожидал:
http://www.site.com/my-protected-directory
Однако все работает должным образом, когда эта страница обслуживается напрямую Apache. Я вижу эту страницу, все остальные не видят.
http://www.site.com:8080/my-protected-directory
Обновить. Конфигурация Nginx (7.1.3.7 - ip сайта):
user apache;
worker_processes 4;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1024;
gzip_http_version 1.1;
gzip_proxied any;
gzip_comp_level 5;
gzip_types text/plain text/css
application/x-javascript text/xml
application/xml application/xml+rss
text/javascript image/x-icon;
server {
listen 80;
server_name www.site.com site.com 7.1.3.7;
access_log logs/host.access.log main;
# serve static files
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
root /var/www/vhosts/www.site.com/httpdocs;
proxy_set_header Range "";
expires 30d;
}
# pass requests for dynamic content to Apache
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Range "";
proxy_pass http://7.1.3.7:8080;
}
}
Обновление 2: mod_rpaf установлен и IP-адрес определяется правильно
Не могли бы вы сказать мне, что не так и как это можно исправить?
Мне удалось решить эту проблему. Проблема была в модуле Rpaf, который при некоторых условиях работает некорректно. Под «условиями» я подразумеваю версию Apache и ОС. (У меня был Apache 2.2 на CentOS)
В любом случае, чтобы исправить это, вы должны отключить модуль rpaf и установить его исправленную версию отсюда: mod_realip2
Установка проста и понятна. Надеюсь, это поможет кому-то, потому что я часами искал решение.
Если nginx проксирует apache, то соединение с apache исходит от nginx, а не от вас, и, следовательно, ваш IP никогда не входит в уравнение.
Вы можете установить переменную среды на основе вашего исходного IP-адреса (который будет храниться в заголовке x-forwarded-for), а затем разрешить запросы с этим набором переменных:
<Location "/">
SetEnvIf X-Forwarded-For ^1\.2\.3\.4 proxy_env
Order allow,deny
Satisfy Any
Allow from env=proxy_env
</Location>
Вы можете попробовать добавить в раздел сервера nginx error_log <path> debug;
, запустите запрос и посмотрите, как он соотносится с правилами расположения. Иногда это не так очевидно ...
Вы разместили root
директива под location
вместо того server
. Это один из самых распространенных неправильная конфигурация nginx. И в этом случае он будет нести прямую ответственность за вашу ошибку 404.