LINUX.ORG.RU

nginx Проверка наличия файла

 


0

1

Есть такой конфиг для доступа к phpmyadmin по адресу https://000.000.000.000/ssylkanaphpmyadmin/index.php

location /ssylkanaphpmyadmin/ {
	alias /var/www/phpmyadmin/www/phpmyadmin/;
	location ~ \.php$ {
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $request_filename;
	}
}

Этот конфиг работает, но как сначала проверять на наличие файл, который запрашивается, и если его нет, то отдавать ошибку 404?

Пробовал вот так, не пашет:

location /ssylkanaphpmyadmin/ {
	alias /var/www/phpmyadmin/www/phpmyadmin/;
	location ~ \.php$ {
		try_files $request_filename =404; # это не пашет
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $request_filename;
	}
}

Этот конфиг работает, но как сначала проверять на наличие файл, который запрашивается, и если его нет, то отдавать ошибку 404?

Это вообще-то обычное поведение веб-сервера, ничего специально делать не нужно. Либо же вы неправильно ставите вопрос.

goingUp ★★★★★ ()
Ответ на: комментарий от goingUp

А озаботился я вообще этим вопросом вот поэтому: http://habrahabr.ru/post/100961/ Там рекомендуют прежде чем передавать путь к файлу на обработку PHP проверять есть ли такой файл на сервере.

iamroman ()
Ответ на: комментарий от iamroman

Там рекомендуют прежде чем передавать путь к файлу на обработку PHP проверять есть ли такой файл на сервере.

Достаточно cgi.fix_pathinfo=0 в php.ini.

dexpl ★★★★★ ()
Последнее исправление: dexpl (всего исправлений: 1)
Ответ на: комментарий от dexpl

Да, это я понял. Но ведь одно другому не мешает. К тому же когда нет файла правильно отдавать ошибку 404, а не «No input file specified.»

iamroman ()

К тому же когда нет файла правильно отдавать ошибку 404, а не «No input file specified.»

fastcgi_intercept_errors не помогает?

try_files $request_filename =404; # это не пашет

А try_files $uri =404; пашет?

dexpl ★★★★★ ()
Ответ на: комментарий от dexpl

А try_files $uri =404; пашет?

Это выдает 404 и на index.php (файл, который есть).

iamroman ()
Ответ на: комментарий от iamroman

Это выдает 404 и на index.php (файл, который есть).

А в логи при этом что-нибудь интересное пишется?

dexpl ★★★★★ ()
Ответ на: комментарий от iamroman

если набрать https://000.000.000.000/ssylkanaphpmyadmin/somefile то действительно выдаст 404, а если https://000.000.000.000/ssylkanaphpmyadmin/somefile.php то выдает сообщение «No input file specified.»


опция MultiViews включена небось? точнее выключена. точнее, что-то мне подсказывает что причина в этом.

Komintern ★★★★★ ()
Последнее исправление: Komintern (всего исправлений: 1)
Ответ на: комментарий от iamroman

Значит, проверяй остальные части конфига, ибо это заведомо рабочее выражение, утащенное с продакшна.

post-factum ★★★★★ ()
Ответ на: комментарий от dexpl

Ничего интересного, в access.log «GET /ssylkanaphpmyadmin/index.php HTTP/1.1» 404 в error.log пусто.

iamroman ()
Ответ на: комментарий от iamroman

А если так:

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

dexpl ★★★★★ ()
Ответ на: комментарий от dexpl

Работает также, как и без него. Без изменений. Nginx перезагружал :)

iamroman ()
Ответ на: комментарий от iamroman

Работает также, как и без него. Без изменений.

А если try-files вынести на один уровень с первым location?

dexpl ★★★★★ ()
Ответ на: комментарий от dexpl

Не пашет. Привожу полные конфиги.

nginx.conf

user www-data;

worker_processes 2;

events {
        worker_connections 1024;
        multi_accept on;
	use epoll;
}

worker_rlimit_nofile 4096;

http {

	include /etc/nginx/mime.types;
	default_type text/html; 
	index index.php index.html index.htm;
	charset utf-8;
	sendfile on; 
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 60;
	reset_timedout_connection on;
        types_hash_max_size 2048;
        server_tokens off;
	client_max_body_size 100m;

	gzip on;
	gzip_min_length 1024;
	gzip_proxied any;
 	gzip_comp_level 5;
	gzip_types text/plain ext/html text/xml application/xml application/x-javascript text/javascript text/css text/json;
	gzip_disable "msie6";

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

}

phpmyadmin

server {
	listen      443 ssl default_server;
	ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
	ssl_certificate     /usr/local/nginx/conf/server.crt;
	ssl_certificate_key /usr/local/nginx/conf/server.key;

	server_name "";

	location / {
		return 444;
	}
	
	location /ssylkanaphpmyadmin/ {
		alias /var/www/phpmyadmin/www/phpmyadmin/;
		location ~ \.php$ {
			fastcgi_pass unix:/var/run/php5-fpm.sock;
       			fastcgi_index index.php;
       			include fastcgi_params;
       			fastcgi_param SCRIPT_FILENAME $request_filename;
		}
	}
}

iamroman ()
Ответ на: комментарий от expelled

Это ясно, вопрос в другом. Как проверить на существование файл перед его передачей к php? Почему-то try_files $uri =404 не работает как надо.

iamroman ()
Ответ на: комментарий от iamroman

Потому что кто-то так и не почитал вики? Второй листинг, по указаной ссылке..

expelled ★★ ()
Ответ на: комментарий от menangen

Выдает 404 на все, на существующие файлы в том числе.

location ~ \.php$ {
                                if (!-f $document_root$fastcgi_script_name) {
                                        return 404;
                                }
                                fastcgi_pass unix:/var/run/php5-fpm.sock;
                                fastcgi_index index.php;
                                include fastcgi_params;
                                fastcgi_param SCRIPT_FILENAME $request_filename;
                        }

iamroman ()
Ответ на: комментарий от iamroman
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
    return 404;
}
expelled ★★ ()
Ответ на: комментарий от expelled

То же самое. Начинает показывать 404 на существующие файлы.

iamroman ()

Всем спасибо.

Решилось так:

                location /ssylkanaphpmyadmin/ {
                        alias /var/www/phpmyadmin/www/phpmyadmin/;
                        location ~ \.php$ {
                                if (!-f $request_filename) {
                                        return 404;
                                }
                                fastcgi_pass unix:/var/run/php5-fpm.sock;
                                fastcgi_index index.php;
                                include fastcgi_params;
                                fastcgi_param SCRIPT_FILENAME $request_filename;
                        }
                }

iamroman ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.