Я хотел бы добавить #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) Я также пытался избежать хеш-кода. вроде ...
Проблема не в ответе на перенаправление. / 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-адресу и инициировать ответ на стороне клиента. Перенаправление на стороне сервера не требуется.
Вы не можете. Фрагменты обрабатываются только браузером. Они никогда не передаются на сервер.