у меня есть mean-stack
сайт с html5mode
включен. В index.html
, У меня есть <base href="/1/" />
. И у меня есть следующая настройка nginx, такая что www.myweb.com/home
становится автоматически www.myweb.com/1/home
(www.myweb.com/js/abc.js
остается www.myweb.com/js/abc.js
):
location ~* ^/\b(?!1|stylesheets|js)\w+\b/? {
rewrite .* /1$request_uri redirect;
}
Теперь мне нужно добавить специальную библиотеку, которая, к сожалению, отключает html5mode
. Так что я собираюсь сдаться html5mode
для всех сайтов.
Итак, теперь я ожидаю, что правило перезаписи будет таким, что
www.myweb.com/home ==> www.myweb.com/1/#/home
www.myweb.com/js/controller.js ==> www.myweb.com/js/controller.js
www.myweb.com/1/abc/def ==> www.myweb.com/1/#/abc/def
www.myweb.com/1/#/abc/def ==> www.myweb.com/1/#/abc/def
Кто-нибудь знает, как изменить приведенную выше перезапись, чтобы включить это? Потому что мой сайт уже в сети. Я хочу убедиться в правилах, прежде чем менять постановку ...
Изменить 1: Я думаю, если я напишу
location ~* ^/\b(?!1|stylesheets|js)\w+\b/? {
rewrite .* /1/#$request_uri redirect;
}
Это приведет к
www.myweb.com/home ==> www.myweb.com/1/#/home (correct)
www.myweb.com/js/controller.js ==> www.myweb.com/js/controller.js (correct)
www.myweb.com/1/abc/def ==> www.myweb.com/1/abc/def (wrong)
www.myweb.com/1/#/abc/def ==> www.myweb.com/1/#/abc/def (correct)
Этот ответ больше недействителен в контексте исходного вопроса. Я сделал слишком быстрые выводы по этому поводу.
После проверки фактов я вижу, что в https://tools.ietf.org/html/rfc7231 упоминается, что перенаправления HTTP могут содержать идентификаторы фрагментов. Это не несовместимо с приведенным ниже описанием, поскольку информация передается клиенту только на основе правил на стороне сервера.
Я не знаю, возможно ли фактическое перенаправление на целевые URL-адреса с идентификаторами фрагментов в nginx.
--- оригинальный ответ ---
Идентификатор фрагмента вообще не появляется в HTTP-запросах. Это чисто концепция на стороне браузера, и вы ничего не можете с этим поделать с программным обеспечением на стороне сервера.
Например, когда на странице есть ссылка на http://www.example.com/main/#part1
, и пользователь щелкает ссылку, браузер отправляет HTTP-запрос на http://www.example.com/main/
, а затем прокрутите вниз до части, отмеченной part1
идентификатор. Это поведение по умолчанию.
Вам необходимо изменить фактические HTML-страницы на вашем сервере, чтобы иметь нужные вам идентификаторы фрагментов.
Я уже использую этот редирект:
# Firts exclude all static files
location ~* (\/)(assets|css|fonts|img|js|lib|locales)(\/)(.*) {}
location ~ /templates {
index index.html index.htm;
try_files $uri.html $uri $uri/ =404;
}
# point to your main file
location = /1 {
try_files /index.html;
}
# finally make the redirect
# redirect for old html5Routing
#location ~ \/ {
# rewrite ^ http://$host/1#$uri redirect;
# break;
#}
# redirect for current html5Routing
location ~ \/ {
rewrite ^ http://$host/1#!$uri redirect;
break;
}
Вы можете использовать отдельный блок для своего /js
дорожка:
location ^~ /js {
... directives for this path ...
}
В ^~
указывает nginx не проверять регулярные выражения для этого пути URL. Дополнительная информация о nginx location
директивы и их порядок можно найти на http://nginx.org/en/docs/http/ngx_http_core_module.html#location.