wumvi
@wumvi

Рewrite как не rewrite?

Всем привет!

Возникла проблема с mod_rewrite у nginx.

Почитал форумы, сысоева и гугл, найти причину не могу

Суть проблемы:


Есть rewrite запись

rewrite ^/blog/([^/]+)/?(.*)?$ /blog/category/$2?$1 break;


есть директории на сервере

blog
category
name


по моей логике запросы типа

/blog/test/ посылаются на /blog/category

/blog/test/name/ посылаются на /blog/category/name/

так и на практике, кроме запроса

/blog/test/name

в конце слэша нет, тогда в этом случае nginx ни с того, ни сего делает redirect на

blog/category/name/?category=test


почему так?
  • Вопрос задан
  • 2687 просмотров
Решения вопроса 1
wumvi
@wumvi Автор вопроса
Разобрался с проблемой
Если установить rewrite_log on
то можно увидеть в чём причина
происходит зацикливание и видно по логике nginx-a
последний цикличный блок вылетает редиректом
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
wumvi
@wumvi Автор вопроса
Пример конфига
server {
	listen 8080;
    server_name  site.lo www.site.lo;

    access_log  W:/hosting/site.lo/nlogs/access.log  main;
 
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/www/nginx-dist;
    }
		
	location ^~ /res/ {}
		
	location = / {}

    location ~ /\.ht {
        deny  all;
    }
		
	rewrite ^/blog/([^/]+)/?(.*)?$ /blog/category/$2?$1 break;

	location / {}
		
	root W:/hosting/site.lo/www/;
	index index.php index.html index.htm;
		
	#For debug only
	autoindex on;
}
Ответ написан
Комментировать
Wott
@Wott
^/blog/([^/]+)/?(.*)?$
Вот зачем перед '$' стоит '?'?

/blog/category/$2?$1
нафига нужен '?$1'?

в конце слэша нет, тогда в этом случае nginx ни с того, ни сего делает redirect на
blog/category/name/?category=test

вообще должен делать внутренний rewrite на /blog/category/name?test, но видимо по этому адресу есть какой-то скрипт, который перенаправляет думая что test это категория
адрес же со слешем на конце добросовестнонаправляется в /blog/category/?test и /blog/category/name/?test, где данный урл прокатывает.
Ответ написан
wumvi
@wumvi Автор вопроса
Убрал $ — проблема осталась

^/blog/([^/]+)/?(.*)? /blog/category/$2?$1 break;
логика у regexp такая что бы запросы
/blog/test/
/blog/unix/
попадали в /blog/category/
/blog/test/name — директория name лежит в category
/blog/unix/name
попадали в /blog/category/name

(.*) — это нужно что бы всё что другое, шло параметрами, для этого ?$1
Ответ написан
wumvi
@wumvi Автор вопроса
Еще одно интересное поведение mod_rewrite нашел

на запрос вида
site.lo/blog/category
rewrite ^/blog/([^/]+)/(.*)$ /blog/category/ break;
он выдаёт страницу (ту которую нужно) и ставит заголовок редиректа на
site.lo/blog/category/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы