Перенаправление Apache на тот же путь, но с # фрагментом

Я хотел бы добавить #fragment для чтения клиентом по определенным URL (и используемым SPA).

<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /
 RewriteRule ^foo/? /foo#bar [QSA,NE,L,R=301]
</IfModule>

Однако, поскольку #bar является фрагментом в указанном выше URL-адресе, кажется, что он удаляется и вызывает цикл перенаправления. Я также пытался избежать хеш-кода, например RewriteRule ^ foo /? /foo\#bar[11105811 impression.

Есть ли способ ограничить RewriteRule только одним перенаправлением?

  • Я пишу это в файл .htaccess в целевом каталоге. Веб-сервер httpd -v Версия сервера: Apache / 2.4.39 (centos)
1
задан 26 June 2019 в 07:39
2 ответа

Я также пытался избежать хеш-кода. вроде ...

Проблема не в ответе на перенаправление. / foo # bar правильно отправляется обратно клиенту в заголовке Location: (здесь помогает флаг NE , предотвращая # ] кодируется URL-адресом в ответе).

Проблема в том, что браузер не отправляет идентификатор фрагмента обратно на сервер по перенаправленному запросу (как заявил @Gerald , «[Фрагменты] никогда не передаются на сервер»). Итак, сервер постоянно видит / foo , отсюда и цикл перенаправления. Вы ничего не можете сделать с отсутствующим идентификатором фрагмента.

С точки зрения сервера, вам нужно будет изменить URL-адрес каким-либо другим способом, например, добавив параметр строки запроса. Например:

RewriteCond %{QUERY_STRING} !^redirect
RewriteRule ^foo/? /foo?redirect=1#bar [QSA,NE,R,L]

Вышеупомянутое добавляет параметр URL redirect = 1 к ответу на перенаправление, и условие гарантирует, что этот параметр отсутствует перед выполнением перенаправления.

Однако добавление параметра URL вероятно, нежелательно.

Поскольку это предназначено только для использования клиентом в SPA, вы должны вместо этого использовать JavaScript History API и replaceState () (или, возможно, pushState () ), чтобы добавить идентификатор фрагмента #bar к URL-адресу и инициировать ответ на стороне клиента. Перенаправление на стороне сервера не требуется.

2
ответ дан 3 December 2019 в 17:32

Вы не можете. Фрагменты обрабатываются только браузером. Они никогда не передаются на сервер.

2
ответ дан 3 December 2019 в 17:32

Теги

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