bug: try files не перенаправляет в location @ и генерит 404

Valeriy nginx-forum at nginx.us
Sun Jan 11 00:25:25 UTC 2015


Здравствуйте!

я пытался организовать рерайты на своем девелопмент сервере и столкнулся со
странным багом.
есть папка с проектами ($document_root), в ней находятся папки которые
соответствуют названиям проектов ($prjct_folder), и в папке проекта есть
папка с исходниками ($prjct_src - ее название по умолчанию src, но могут
быть другие src2, src_old, ...). 

стояла задача при обращении по адресу (ЧПУ)

http://dev_hos/project_name/src/badurl

и адресу

http://dev_hos/project_name/badurl

перенаправлять оба логически одинаковых URL на исполнение скрипту:

/var/www/project_name/src/index.php

----------------------------------------------------------------------------

для реализации я создал конфиг похожий на этот (максимально упрощенный
вариант)

----------------------------------------------------------------------------

server
{
	listen		80;
	server_name	bug;
	root		/var/www;

	set	$prjct_folder	'';
	set	$prjct_src	'src';
	set	$prjct_uri	'';

	location /
	{

		add_header	Content-Type	'text/html; charset=UTF-8';
		return		200		other;
		
	}

	location ~*	^/([^/]+)/?(src[^/]*)?/?(.*)
	{
			set	$prjct_folder	$1;
			set	$tmp_src	$2;
			set	$prjct_uri	$3;

		if ($tmp_src)
		{
			set	$prjct_src	$tmp_src;
		}

		try_files	$uri	@notfound;

#		add_header	Content-Type	'text/html; charset=UTF-8';
#		return		200		$document_root/$prjct_folder/$prjct_src/$prjct_uri;
	}

	location @notfound
	{
		add_header	Content-Type	'text/html; charset=UTF-8';
		return		200		$document_root/$prjct_folder/$prjct_src/$prjct_uri;
	}
}

----------------------------------------------------------------------------

логика работы следующая: при обращении к серверу, ЧПУ попадает на обработку
в блок с регулярным выражением, регулярное выражение извлекает из него
название папки проекта и название папки с исходниками (если такова в адресе
есть) и перенаправляет в блок @notfound который вызывает нужный скрипт
(логику вызова скрипта я убрал, оставил только инструкции для дебага)

----------------------------------------------------------------------------

баг заключается в том, что при обращении по адресу вида (содержит src)

http://dev_hos/project_name/src/badurl

nginx выдает 404 проходя мимо блоков @notfound и /

при заходе на адрес без src

http://dev_hos/project_name/badurl

nginx корректно переходит в блок @notfound

----------------------------------------------------------------------------

в лог nginx попадает следующая ошибка:

#[error] 4288#0: *1 open() "/var/www/project_name/src/badurl" failed (2: No
such file or directory), client: 192.168.234.1, server: bug, request: "GET
/project_name/src/badurl HTTP/1.1", host: "bug"

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,256033,256033#msg-256033



Подробная информация о списке рассылки nginx-ru