PHP в псевдониме каталога NGINX, не работающем

У меня есть новая установка сервера Ubuntu 14.04. Я установил nginx, php, и т.д....

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

  location /alias {
    alias  /var/www/htmlalias;
    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
  }
}

Если я использую простой сценарий PHP в /var/www/htmlone php выполняется как ожидалось. Если я использую тот же сценарий в /var/www/htmlalias это не выполняется как ожидалось. Если я вставил HTML-сценарий /var/www/htmlalias это действительно однако отображается как ожидалось, таким образом, псевдоним действует как псевдоним, но не выполняет php файлы, но работы php в основном корневом каталоге.

Я нашел по многим serverfault вопросам, что эта общая установка должна работать все же, это не. Кто-либо видит что-нибудь, что я могу делать неправильно? Я не вижу сообщений в журнале ошибок.

Я должен добавить, что это для nginx версии: nginx/1.8.0

4
задан 26 May 2015 в 14:31
3 ответа

Проблема, с которой вы столкнулись, на самом деле является давней ошибкой, зарегистрированной 3 года назад , которая вызывает псевдоним и try_files , чтобы не работать вместе.

На странице с ошибкой есть обходной путь Люка Хауэлла , который выглядит следующим образом:

location /api { ## URL string to use for api ##
    alias /home/api/site_files/; ## Site root for api code ##

    ## Check for file existing and if there, stop ##
    if (-f $request_filename) {
        break;
    }

    ## Check for file existing and if there, stop ##
    if (-d $request_filename) {
        break;
    }

    ## If we get here then there is no file or directory matching request_filename ##
    rewrite (.*) /api/index.php?$query_string;

    ## Normal php block for processing ##
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Обратите внимание, что что касается nginx, ЕСЛИ является злом , и его следует по возможности избегать .

6
ответ дан 3 December 2019 в 02:50

Из моего тестирования вышеупомянутой конфигурации именно присутствие

try_files $uri =404;

внутри вложенного псевдонима php location вызывает проблему. С его помощью nginx проверяет наличие "/var/www/htmlalias/alias/index.php" (обратите внимание на добавление псевдонима и uri), обнаруживает, что его не существует, а затем возвращает 404. Удаление этого файла try_files сначала останавливает поиск этого файла на диске и передает запрос непосредственно в fastcgi, который затем находит правильный файл в SCRIPT_FILENAME.

Если вы хотите, чтобы несуществующие файлы PHP выдавали ошибку 404, а не ошибку PHP, то работает следующее:

  location /alias {
    alias  /var/www/htmlalias;
    location ~ /([^/]+\.php)$ {
      try_files /$1 =404;
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }

Сначала регулярное выражение фиксирует имя файла заполнения файла php (например, foo.php) как $ 1. Затем try_files проверяет, существует ли этот файл относительно текущего псевдонима, и возвращает 404, если нет.

Затем мы должны переопределить SCRIPT_FILENAME по умолчанию, как определено в fastcgi_params, переопределив его после включения, потому что $ request_filename будет по какой-то причине я не понимаю, это совсем не то (буквально /index.php).

2
ответ дан 3 December 2019 в 02:50

Вот как я решил это:

конфигурация сервера по умолчанию (без псевдонима), в вашем примере:

server {
  listen 80;
  listen [::]:80;

  server_name testone.local;

  root /var/www/htmlone;
  index index.html;

  # pass the PHP scripts to FastCGI server listening on the php-fpm socket
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

и из командной строки создайте символическую ссылку под / var / www / htmlone :

ln -s / var / www / htmlalias / var / www / htmlone / alias

0
ответ дан 3 December 2019 в 02:50

Теги

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