LINUX.ORG.RU
ФорумAdmin

Проблема c location в nignx

 , ,


0

2

Доброго вам, господа! Суть такова. Есть хост машина с nginx и гостевая виртуалка с apache2. На госте крутится почтовый сервер с postfixadmin, roundcube и прочими вещами. Необходимо, чтобы при обращении на mail.company.com сразу открывался веб-интерфейс roundcube. Это я сделал добавлением такого локейшена:

 
location  /
    {
        proxy_pass      http://192.168.122.107:80/roundcube/;
        proxy_redirect  off;
        proxy_read_timeout 300;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-Proto  https; # for SSL, add this
        proxy_set_header X_SCHEME           https;
    }
Через местоположение /postfixadmin перехожу на админку.
   location /postfixadmin/
   {
        proxy_pass      http://192.168.122.107:80/postfixadmin/;
        proxy_redirect  off;
        proxy_read_timeout 300;

        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-Proto  https; # for SSL, add this
        proxy_set_header X_SCHEME           https;
    }

Но если я хочу указать дополнительные локейшены через переменную $reques_uri, то nginx передаёт на проксируемый сервер запрос с /roundcube/$request_uri
   location /$request_uri/
   {
        proxy_pass      http://192.168.122.107:80/$request_uri/;
Если указать задать location как
 location = /
   {
        proxy_pass      http://192.168.122.107:80/roundcube/;
то веб-интерфейс отображается без графического оформления, а в логах видно, что nginx пытается искать файлы на хост машине в /var/www/html. Подскажите, пожалуйста, как правильно настроить проксирование. И правильно ли я понимаю, что location с переменными имеет наинизший приоритет? Версия nginx 1.5.8

Если вы указываете location = /, то правило действует только для стартовой страницы (равенство же).

Если я правильно понял, что вы хотите, используется последний вариант, но поставьте там location ~* /

l0stparadise ★★★★★ ()

А еще конструкция location /$request_uri/ в корне неверна. $request_uri - это переменная, в которой содержится полная строка запроса, которая потом проверяется на совпадение с тем или иным location. То есть, получается, вы проверяете, совпадает ли строка сама с собой :)

l0stparadise ★★★★★ ()
Ответ на: комментарий от l0stparadise

Спасибо за ответ! Хм, я считал, что $request_uri - это как раз та часть, которая берётся после $server_name. Окей, если я использую переменную $uri получается та же песня. В эрроре видно, что невозможно найти /roundcube/$uri. А вот по поводу «location ~* /» получил такое:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"

Stoner ()
Ответ на: комментарий от Stoner

Вы правильно поняли. Суть в том, что $uri и $request_uri (это синонимы) нельзя использовать в объявлении location, как это сделали вы.

Дальше. В proxy_pass может быть только статическая ссылка. $uri в любом случае будет и так добавляться в конец. То есть, конструкция

location ~* / {
proxy_pass http://192.168.122.107:80/roundcube/;
означает, что все, что в вашем адресе после первого слеша, будет проксировано на эту страницу и дописано после roundcube, без необходимости указания uri.

l0stparadise ★★★★★ ()
Ответ на: комментарий от l0stparadise
location ~* / {
proxy_pass http://192.168.122.107:80/roundcube/;

В любом случае, этот вариант не работает, как и сказал при релоаде nginx. Нельзя изменять uri при проксировании, если локейшен задан в виде регулярного выражения.

Stoner ()
Ответ на: комментарий от l0stparadise
server {
    listen 1.2.3.4:80;
    server_name mail.company.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 1.2.3.4:443;
    server_name mail.company.com;

    reset_timedout_connection  on;

    ssl on;

    ssl_ciphers            ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;
    ssl_session_cache      shared:SSL:10m;
    ssl_verify_depth 3;

    ssl_certificate /etc/ssl/certs/mail.company.com/mail.company.com.crt;
    ssl_certificate_key /etc/ssl/certs/mail.company.com/mail.company.com.key;
    add_header Strict-Transport-Security max-age=31536000;

    location /
    {
        proxy_pass      http://192.168.122.107:80/roundcube/;
        proxy_redirect  off;
        proxy_read_timeout 300;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-Proto  https; # for SSL, add this
        proxy_set_header X_SCHEME           https;
    }

   location /postfixadmin/
   {
        proxy_pass      http://192.168.122.107:80/postfixadmin/;
        proxy_redirect  off;
        proxy_read_timeout 300;

        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-Proto  https; # for SSL, add this
    }
}

Stoner ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.