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

Директива Nginx Location - файл загружается

В настоящее время у меня установлен блок местоположения 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;
}