[SOLVED] Get URL for router from browser

С get параметрами мне все понятно, с путями и URL тоже.

Вопрос простой - пишу в браузере mydomain.ru/MYDIR/about, жму enter и хочу попасть на about.html в папке pages. как будто я просто нажал на линк /about/

прописал абсолютные пути в роутере, сделал редирект на index.html, включил pushState и указал root директорию

Я понял что Вы имели ввиду. При редиректе на index я просто активирую обработку маршрутов от корня, но запускать роутер нужно самостоятельно, app.router, указав параметры запуска. Так?

где торможу, не могу понять?

Мне кажется я должен сам ловить url (в данном случае путь из строки браузера document.location.href), и дальше вызывать роутер с параметрами, т.к. автоматически это не делается, правильно?

app.view.main.router.navigate(app.views.main.router.currentRoute.path) - решил бы вопрос, но после того, как происходит редирект на index.html теряется начальный URL

а зачем мне использовать стороннюю библиотеку для парсинга, если F7 делает это сам по ссылке /users/:user/:userId/:posts/:postId/? Я думаю, что могу отправить этот путь роутеру и он сам выдаст результат.

Может я неправильно делаю редирект?
После редиректа меняется pushState в строке браузера, но не работает роутинг - всё время первая страница. Как мне достучаться от адресной строки браузера до роутинга?

Проблема как я вижу на сервере. Вы сделали отдачу index.html на любой запрос. Чтобы роутер не пытался загрузить, сервер отдает index.html

хорошо. Я буду думать как это реализовать. Это получается нужно делать свои маршруты на сервере…

А как такая в принципе нужная штука делается “из коробки”? Я так понял есть возможность отображения пути в строке браузера, но как получить обратную возможность - роутинг по указанному в строке пути. Может есть примеры?

ну я так и сделал, выходит это ошибочно? Хотя, по идее, я передаю управление app.js, он смотрит app.views.main.router.currentRoute.path или window.location.pathname и запускает app.view.main.router.navigate(полученный путь), пытаясь загрузить страницу с URL, назначенным этому пути в routes.js. PushState пишет новый путь. Но тут опять срабатывает редирект, это замкнутый круг.
Выходит мне нужен редирект только при команде из строки браузера, а при программном переходе через роутер - нет.
К томуже при редиректе теряется url и app.js уже получает начальный путь - ‘/’

Все правильно, есть такой роут:

path: '/about/',
componentUrl: './pages/about.html',
  • Когда мы обращаемся website.com/about/ сервер должен отдать index.html
  • Когда мы обращаемся website.com/pages/about.html сервер должен отдать /pages/about.html

Так если редиректить, то при редиректе теряется url и app.js уже получает начальный путь - ‘/’

а если отдать сразу /pages/about.html, не подключатся css и js

Что значит редиректить?

Редиректы тут никакие не нужны (на стороне клиента)

в .htaccess я перевожу запрос на index.html, это я и называю редиректить
на сервере

Ну нужно делать как я показал, он не должен всё редиректить. То что грузится роутером не нужно. Если все страницы (html) лежат в папке, то можно настроить что если запрос к этой папке то отдавать как есть

вот я так и пишу на сервере:
Redirect 301 /about/ https://website.com/index.html

дальше управление переходит к app.js. так? Он смотрит путь в браузере, а там то уже рут! Он не знает что нужно запустить about. Вот я и спрашиваю, как при редиректе передать путь для правильного дальнейшего запуска роутера

Тут верно.

А тут

Не надо

  • Когда мы обращаемся website.com/about/ сервер должен отдать index.html

вот я так и пишу на сервере:
Redirect 301 /about/ https://website.com/index.html

дальше управление переходит к app.js. так? Он смотрит путь в браузере, а там то уже рут! Он не знает что нужно запустить about. Вот я и спрашиваю, как при редиректе передать путь для правильного дальнейшего запуска роутера

Дальше роутер всё сделает сам. Он увидит в браузере /about/, найдет нужный роут и загрузит

I found the correct setting .htaccess !! So it works:

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteRule ^(.*)$ ./index.html

N.B. the routes.js requires an absolute file path

2 Likes

Долго я искал решение. Сработало Ваше. Очень признателен!