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

Nginx путает $ fastcgi_script_name с $ fastcgi_path_info

Вот соответствующая часть моего файла конфигурации Nginx:

http {
    log_format  fastcgi
                '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$fastcgi_script_name" "$fastcgi_path_info"';

    server {
        listen       8080;
        server_name  localhost;

        access_log  /usr/local/var/log/nginx/access.log  fastcgi;

        location / {
            fastcgi_index /;
            fastcgi_pass unix:/usr/local/var/www/run/httpd.sock;
            include fastcgi_params;
        }
    }
}

В основном у меня есть сокет Unix в /usr/local/var/www/run/httpd.sock который обрабатывает запросы FastCGI, и работает довольно хорошо. Проблема здесь в том, что Nginx считает, что последняя часть URI - это имя скрипта, но это должна быть информация о пути. Например

⇒ nginx -v
nginx version: nginx/1.15.0
⇒ nginx
⇒ curl -i localhost:8080/index
HTTP/1.1 200 OK
Server: nginx/1.15.0
Date: Tue, 10 Jul 2018 12:27:15 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

<p>hello, world</p>
⇒ tail -n 1 /usr/local/var/log/nginx/access.log
127.0.0.1 - - [10/Jul/2018:20:27:15 +0800] "GET /index HTTP/1.1" 200 30 "-" "/index" ""

Это означает $fastcgi_script_name является /index, с участием $fastcgi_script_name это пустая строка.

Как настроить Nginx, чтобы $fastcgi_script_name чтобы содержать последнюю часть URI, т.е. такие вещи, как /index?

Во-первых, в вашем блоке местоположения у вас есть эта директива include fastcgi_params;

Предположительно, в том же каталоге, что и ваш nginx.conf, вы найдете файл с именем fastcgi_params, который будет содержать множество параметров конфигурации, относящихся к этому типу вещей, поэтому сначала проверьте это.

Если это все, что вы хотите, вы можете использовать fastcgi_split_path_info в блоке местоположения, чтобы определить два захвата регулярных выражений из URI запроса, один для fastcgi_path_info переменная, а другая - для fastcgi_script_name переменная