У меня есть новая установка сервера 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
Проблема, с которой вы столкнулись, на самом деле является давней ошибкой, зарегистрированной 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, ЕСЛИ является злом , и его следует по возможности избегать .
Из моего тестирования вышеупомянутой конфигурации именно присутствие
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).
Вот как я решил это:
конфигурация сервера по умолчанию (без псевдонима), в вашем примере:
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