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

nginx - cURL извлекает файлы PHP, но доступ через веб-браузер дает исходный код

У меня проблемы с nginx. Я устанавливаю nginx на Raspberry Pi B + (Raspbian Jessie) и PHP с FastCGI. Когда я пытаюсь использовать cURL для получения страниц, он возвращает HTML-код, сгенерированный PHP.

Блок сервера nginx, обслуживающий запросы fastcgi

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=on default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /usr/share/nginx/html;

    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
    #       include snippets/fastcgi-php.conf;
            include fastcgi_params;
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;

    #
    #       # With php5-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    }


    # deny access to .htaccess files, if Apache's document root
    #oncurs with nginx's one
    #
    #location ~ /\.ht {
    #       deny all;
    #}
}

ФАЙЛ PHP

<?php
echo "PHP Test";
?>

Ответ браузера: либо загружает его (Chrome), либо отображает как исходный код (другие браузеры)

cURL:

nginx access.log

::1 - - [12/May/2017:12:21:20 +0800] "GET /test_2.php HTTP/1.1" 20019 "-" "curl/7.38.0"
192.168.0.132 - - [12/May/2017:12:26:28 +0800] "GET /test_2.php HTTP/1.1" 200 28 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"

nginx error.log

2017/05/12 11:50:41 [error] 21715#0: *64 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.132, server: ~., request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.113"
2017/05/12 11:53:02 [error] 21715#0: *66 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.0.132, server: ~., request: "GET /favicon.ico HTTP/1.1", host: "192.168.0.113"
2017/05/12 11:54:18 [notice] 21737#0: signal process started
2017/05/12 11:54:22 [notice] 21747#0: signal process started

РЕДАКТИРОВАТЬ: после комментария Тима ниже я запустил curl для принудительного IPv4, и он действительно вернул исходный код.

Думаю, я знаю, почему это так. Мой второй серверный блок, который разрешает все имена с помощью RegEx ~. настроен на прослушивание порта 80, который является IPv4, и у него нет обработчика CGI. Однако по умолчанию серверный блок настроен на прослушивание порта 80 для IPv6. Поскольку nginx выполняет откат к серверу по умолчанию только после тестирования других серверов, блоку прокси-сервера нечего обрабатывать PHP, поэтому он возвращает его как исходный код. В IPv6 nginx не может использовать блок прокси-сервера для обработки запроса, поэтому он передает его на сервер по умолчанию, на котором работает сервер FastCGI, таким образом, он может вернуть phpinfo().

Решение

Я должен поставить location /git/ блок пропуска прокси в блоке сервера по умолчанию.