В настоящее время у меня установлен блок местоположения Nginx, который соответствует uri тогда и только тогда, когда он начинается и заканчивается на /auth/test.php
. Единственным совпадением будет http://host/auth/test.php
.
location ~ ^/auth/test\.php$ {
# Use try files or the if statement below. try_files is preferred
# If the original URI ($uri) does not resolve into an existing file or directory, a 404 error is returned
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$; #
fastcgi_param USERNAME $arg_username;
fastcgi_param PASSWORD $arg_password;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
}
Насколько я понимаю, параметры запроса не играют роли, когда Nginx пытается сопоставить блок местоположения. Мой сценарий, test.php
, обрабатывается, когда uri имеет вид http://host/auth/test.php?username=blah&password=blah
. Однако, если я попробую использовать uri без параметров запроса (http://host/auth/test.php
) сценарий test.php
загружается тем, кто его запрашивал, что не идеально. Есть ли способ заставить Nginx не обрабатывать этот тип uri-запроса? Я думал try_files
Директива позаботится об этом случае, но, по-видимому, нет. Спасибо.
Сначала вы должны использовать «=», если вы хотите точное совпадение строки URI.
location = /auth/test.php {
И для обработки .php location
должно быть что-то вроде этого:
location /auth/test.php {
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
Эти две строки позволяют обрабатывать PHP независимо от версии PHP.
Прежде всего, ваше регулярное выражение полностью соответствует строке URI. Поэтому используйте вместо этого точное (нерегулярное) соответствие NGINX. Это также позаботится об обеспечении наивысшего приоритета:
location = /auth/test.php {
Далее, похоже, вам не нужны URL-адреса типа /auth/test.php/foo
для пересылки в разные файлы PHP. Так что избавься от fastcgi_split_path_info
полностью.
Настоящий /auth/test.php
script - это тот, который обрабатывает запрос. Так что просто укажите его имя в директивах fastcgi:
fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;
Наконец, try_files $uri =404;
не имеет значения и может вызвать больше проблем. Вы уже знаете, что файл есть, вам не нужны дополнительные stat
системные вызовы для проверки его существования.
Таким образом, полный фрагмент может быть таким:
location = /auth/test.php {
fastcgi_param USERNAME $arg_username;
fastcgi_param PASSWORD $arg_password;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/auth/test.php;
include fastcgi_params;
}