@corpsepk

Почему Nginx отдает исходный php код index.php, но исполняет остальные php файлы?

С помощью Vagrant и PUPHPET сконфирурировал сервер.
Настройки vhost скопировал с боевого сервера (удалив не важные для данной проблемы локейшены).

При переходе на:
site.dev
site.dev/index.php
nginx отдает исходный код файла index.php.

При этом если перейти например на site.dev/page_doesnt_exist то index.php исполняется.

Конфиг nginx
user www-data;
worker_processes 1;
worker_rlimit_nofile 1024;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
  worker_connections 1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  access_log  /var/log/nginx/access.log;

  sendfile    on;

  server_tokens on;

  types_hash_max_size 1024;
  types_hash_bucket_size 512;

  server_names_hash_bucket_size 64;
  server_names_hash_max_size 512;

  keepalive_timeout  65;
  tcp_nodelay        on;

  gzip         on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  include /etc/nginx/conf.d/*.conf;
  #include /etc/nginx/sites-enabled/*;

  server {
    listen                192.168.56.101:80;

    server_name           site.dev;
    set $yii_bootstrap    "index.php";

    root                  /var/www/site.ru;

    access_log            /var/log/nginx/site.dev.access.log;
    error_log             /var/log/nginx/site.dev.error.log;

    charset utf-8;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;

        include fastcgi_params;
    }

    sendfile off;
  }
}


Причем странное дело, если во всех location проставить deny all, то site.dev/index.php и site.dev всё равно отдают исходный код, но сюда site.dev/page_doesnt_exist уже не пускает.
Но как так?
Получается запрос обрабатывается какими то другими location, но я специально слил все в один конфиг, чтобы ничего лишнего случайно не подцепилось...

п.с.
Если создать файл phpinfo.php <? phpinfo();?> и перейти на site.dev/phpinfo.php, то он тоже исполняется.

upd:
Добавил index index.php;:
location / {
    index index.php;
    try_files $uri $uri/ /$yii_bootstrap?$args;
}


Стал открываться сайт по адресу http://site.dev, но site.dev/index.php все равно отдает исходный код.
  • Вопрос задан
  • 4531 просмотр
Пригласить эксперта
Ответы на вопрос 3
Taras_Serevann
@Taras_Serevann
веб-разработчик, автор
1. Возможно, в .htaccess стоит строка, которая отвечает за такое поведение index.php?
2. Возможно, у вас опечатка, и формат файла не соответствует .php?
3. Возможно, п. 1 только в конфигах на уровне сервера?
Ответ написан
Комментировать
А "fastcgi_index" nginx.org/ru/docs/http/ngx_http_fastcgi_module.htm...

location ~ \.php$ {
.....
fastcgi_index index.php;
.....
}
Ответ написан
Комментировать
@drgra
>> 2. Возможно, у вас опечатка, и формат файла не соответствует .php?

вот это можно пояснить.
у меня как-то раз было то же самое. Оказалось что php-файл
начинался с <? вместо положенных <?php
Так же это может лечиться в конфиге php директивой short_open_tag
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы