В Документация Apache довольно четко заявляет, что mod_rewrite
должно быть только крайней мерой. Для nginx
, в разделе "Подводные камни" есть примеры, когда request_uri
практически не изменился.
Ситуация такая:
ProxyPass
rules (значительная часть его работы - проксирование). Я хочу переместить их всех в nginx
, поскольку, как я понимаю, nginx
более эффективен при проксировании.http://my.site/muru
и http://my.site/~muru
будет проксироваться на http://other.server/~muru
, но http://other.server/muru
не существует).http://my.site/local-club
будет проксироваться на http://my.site/~local-club
).Мой главный вопрос:
rewrite
или location
с участием return
перенаправить запросы на B
к A
, или продолжить проксирование обоих? Перенаправление (и return
) имеет то преимущество, что четко указывает связь между двумя каталогами.
Мой rewrite
правила выглядят так:
rewrite ^/B(/.*) /A$1 permanent;
И return
правила:
location ~ ^/B(/.*) {
return 301 /A$1;
}
С участием:
location ~ ^/~(A|D|E|F..)/ {
proxy_pass https://other.server;
proxy_redirect default;
}
На самом деле это не имеет значения, execpt, если ваш сервер nginx будет обрабатывать тысячи запросов в секунду, и вы хотите, чтобы каждый запрос не тратил время процессора на соответствие регулярных выражений перезаписи. Теперь я бы сказал, что используйте наиболее понятный способ записи файлов конфигурации, пока вы не достигнете этого предела, тогда, если у вас нет бюджета для масштабирования вашей инфраструктуры, пришло время подумать о том, чтобы обмануть вашу конфигурацию, чтобы она соответствовала вашему трафику. Недостатком возврата является то, что если у вас есть несколько перенаправлений, вы получите одно место, оборачивающее одну директиву возврата. Используя перезаписи, вы можете поместить несколько из них в одно общее место и протестировать первый параметр для более конкретного шаблона.
Обновление: пример множественного перенаправления в общем месте:
location /B {
rewrite ^/B/foo/(.*)$ /A/newfoo/$1 permanent;
rewrite ^/B/bar/(.*)$ /A/newbar/$2 permanent;
rewrite ^/B/(.*)$ /A/$1 permanent;
}