nginx перезаписывает с сохранением параметров запроса CGI (с хэш-привязкой) - PullRequest
1 голос
/ 04 ноября 2019

Для моей конфигурации www.example.com nginx у меня есть следующие правила перезаписи:

rewrite ^/foo$       https://one.example.com/page#one     permanent;
rewrite ^/foo(\?.*)$ https://two.example.com/page$1#two   permanent;

rewrite ^/bar$       https://three.example.com/page#one   permanent;
rewrite ^/bar\?(.*)$ https://four.example.com/page?$1#two permanent;

Запрос на http://www.example.com/foo правильно перенаправляет на https://one.example.com/page#one.

Запрос наhttp://www.example.com/bar правильно перенаправляет на https://three.example.com/page#one.

Запрос на http://www.example.com/foo?extra=yes неправильно перенаправляет на https://one.example.com/page#one?extra=yes (я ожидаю, что он перейдет на https://two.example.com/page?extra=yes#two).

Запрос на http://www.example.com/bar?extra=yes неправильно перенаправляет на https://three.example.com/page#one?extra=yes (я ожидаю, что он перейдет на https://four.example.com/page?extra=yes#two).

Как я могу перенаправить на страницу, копируя параметры CGI и связываяна конкретный якорь на странице назначения?

1 Ответ

1 голос
/ 05 ноября 2019

Похоже, что директива rewrite неправильно обрабатывает фрагмент # при сборке строки запроса в строку замены.

Вы можете запретить добавлению строки запроса rewrite, добавивтрейлинг ? к строке замены. Таким образом, вы можете построить правильный результат, используя встроенные переменные $is_args и $args.

Например:

rewrite ^/foo$ https://one.example.com/page$is_args$args#one? permanent;

См. этот документ дляподробности.

Обратите внимание, что строка запроса не является частью нормализованного URI, используемого для сопоставления операторов rewrite и location, поэтому ваше регулярное выражение ^/foo(\?.*)$ не будет работать.

...