Документация Apache довольно ясно указывает это mod_rewrite
должно только быть последнее средство. Для nginx
, раздел Pitfalls имеет примеры где request_uri
чрезвычайно неизменно.
Ситуация - это:
ProxyPass
правила (существенный объем его работы проксирует). Я хочу сместить всех их к 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;
}