Решено: nginx и subfolders

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Решено: nginx и subfolders

Сообщение SLEDopit »

день добрый.

есть nginx, который настроен я пытаюсь настроить как самостоятельный веб-сервер (без бэк-эндов) и php через fast-cgi (spawn-fcgi).
все это крутится на 8.0 freebsd.
все работает, за исключением одного:
если в директории с сайтом создать папку forum, то при попытке открыть site.ru/forum мне вылезает обычная 404 страничка установленной cms. аналогично не получается (ну вообще никак не получается) объвить alias для phpmyadmin, чтобы по site.ru/phpmyadmin оно переходило куда мне надо, а не на 404.
как его заставить ходить в папку forum, а не переделывать эту папку в 404 страничку ошибки?
конфиг ngnix'a:

Код: Выделить всё

user user user;
worker_processes  4;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       ip.address:80;
        server_name  site.net www.site.net;

    location / {
            root   /data/www/site.net;
            index  index.php index.html index.htm;
        }

    location ~* ^/forum/ { # папка форум есть, однако сюда он не переходит;
                               # так же пробовал и location /forum с / и без в конце. ничего не помогает.
            root   /data/www/site.net/forum;
            index  index.php index.html index.htm;
        }
    if ($host !~* ^www\.) {
        rewrite ^(.*)$ http://www.$host$1 permanent;
    }
    if ( !-e $request_filename ) { #необходимо для корректной отработки чпу в cms'ине
        rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
        break;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
            root           /data/www/site.net;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /data/www/site.net$fastcgi_script_name;
            include        fastcgi_params;
        }
       }
}
я не исключаю, что я плохо прочитал ман или плохо гуглил свою проблему, но решения я так и не нашел.
буду благодарен за подсказки (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Решено: nginx и subfolders

Сообщение KiWi »

ifы выполнются ДО проверки location.

Таким образом,

Код: Выделить всё

    if ( !-e $request_filename ) { #необходимо для корректной отработки чпу в cms'ине
        rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
        break;
        }


Переписывает /forum/ на /index.php со всеми вытекающими.

Этот if можно переписать на:

Код: Выделить всё

error_page 404 = @fallback;

location @fallback {
            root           /data/www/site.net;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
}

P.S.:

Код: Выделить всё

fastcgi_param  SCRIPT_FILENAME  /data/www/site.net$fastcgi_script_name;

можно поменять на:

Код: Выделить всё

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Решено: nginx и subfolders

Сообщение SLEDopit »

а, ну тогда многое прояснилось, но предложенный способ не работает. в логи падает вот что:

Код: Выделить всё

2011/01/27 08:41:04 [error] 69152#0: *4 open() "/data/www/site.net/notes" failed
(2: No such file or directory), client: xx.xx.xxx.xx, server: site.net,
request: "GET /notes HTTP/1.1", host: "www.site.net", referrer: "http://www.site.net/"
хотя это как раз та чпу ссылка, по которой до удаления if'а он ходил, а после - перестал. а на форум теперь ходит. в принципе, если не добавлять location fallback, эффект был бы таким же )
такое ощущение, что location @fallback вообще не обрабатывается.

update. хотя если

Код: Выделить всё

fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
заменить на

Код: Выделить всё

fastcgi_param  SCRIPT_FILENAME $document_root/index.php$fastcgi_script_name;
то оно начинает работать наполовину. а вторая половина все равно не работает. видать начинаются премудрости joomla.
просто тут начинается переадресация не nginx'вскую 404, а на 404 cms, видать nginx не считает такие странички ошибочными и переадресация не происходит.

большое спасибо, KiWi.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Решено: nginx и subfolders

Сообщение SLEDopit »

в общем, если кому вдруг пригодится, полностью рабочее решение (nginx + fcgi + joomla):

Код: Выделить всё

location / {
            root   /path/to/joomla;
            index  index.php;
            if (-e $request_filename) {
              break;
            }
            rewrite ^/(.+)$ /index.php?q=$1 last;
        }
полный конфиг:

Код: Выделить всё

user  site site;
worker_processes  4;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       195.14.104.32:80;
        server_name  site.net www.site.net;
        location / {
            root   /data/www/site.net;
            index  index.php index.html index.htm;
            if (-e $request_filename) {
              break;
            }
            rewrite ^/(.+)$ /index.php?q=$1 last;
        }
        if ($host !~* ^www\.) {
        rewrite ^(.*)$ http://www.$host$1 permanent;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

        location ~ \.php$ {
            root           /data/www/site.net;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /data/www/site.net$fastcgi_script_name;
            include        fastcgi_params;
        }
        location ~ /\.ht {
            deny  all;
        }
    }
}
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали: