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

Странное поведение Htaccess с Nginx

У меня есть сайт, работающий на 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.