Систематически добавлять фрагменты в URL-адреса

У меня есть веб-сайт среднего стека с включенным html5mode . В index.html у меня есть . И у меня есть следующие настройки 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)
-1
задан 1 January 2018 в 22:41
3 ответа

Этот ответ больше недействителен в контексте исходного вопроса. Я сделал слишком быстрые выводы по этому поводу.

После проверки фактов я вижу, что в https://tools.ietf.org/html/rfc7231 упоминается, что перенаправления HTTP могут содержать идентификаторы фрагментов. Это не является несовместимым с описанием ниже, поскольку информация передается клиенту только на основе правил на стороне сервера.

Я не знаю, возможно ли фактическое перенаправление на целевые URL-адреса с идентификаторами фрагментов в nginx.

--- исходный ответ ---

Идентификатор фрагмента вообще не появляется в HTTP-запросах. Это чисто концепция на стороне браузера, и вы ничего не можете с этим поделать с программным обеспечением на стороне сервера.

Например, когда на странице есть ссылка на http://www.example.com/main/#part1 , и пользователь щелкает ссылку, браузер отправляет HTTP-запрос на http://www.example.com/main/ , а затем прокручивает вниз до части, отмеченной part1 идентификатор. Это поведение по умолчанию.

Вам необходимо изменить фактические HTML-страницы на вашем сервере, чтобы иметь нужные идентификаторы фрагментов.

3
ответ дан 5 December 2019 в 19:12

Вы можете использовать отдельный блок для вашего пути / js :

location ^~ /js {
    ... directives for this path ...
}

^ ~ указывает nginx не проверять регулярные выражения для этого пути URL. Дополнительную информацию о директивах nginx location и их порядке можно найти по адресу http://nginx.org/en/docs/http/ngx_http_core_module.html#location .

0
ответ дан 5 December 2019 в 19:12

Я уже использую этот редирект:

# 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;
}
0
ответ дан 5 December 2019 в 19:12

Теги

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