Клиентское Javascript-приложение - маршрутизация URL без тэга
Я работаю над новым клиентским приложением с последней версией Ember.js. Существует одна страница PHP, которая создает скрипты, css, файлы шаблонов и т.д. И доставляет их все в index.php. Я использую директиву htaccess, чтобы все запросы были переписаны в /index.php. PHP только там, чтобы удобно упаковать Javascript, насколько мне известно.
В настоящее время маршруты в браузере выглядят так и работают нормально.
/#/about
/#/favorites
/#/etc
/#/posts/5/edit
Однако, я бы хотел, чтобы они выглядели так: они не работают нормально.
/about
/favorites
/etc
/posts/5/edit
Тот же самый клиентский код по-прежнему поставляется со вторым параметром, но он всегда попадает в обработчик маршрута указателя. Я видел, как приложения на стороне клиента снимают это раньше - чего мне не хватает? Нужно ли иметь соответствующие обработчики маршрутов на стороне PHP?
Изменить: Я ищу конкретный ответ о том, как подойти к этому. Сеть полна информации "о, вы просто делаете это", которая оставляет всех почесывающих головок.
Ответы
Ответ 1
В Ember.js(версия 1.0.0rc3) это может быть выполнено с помощью Ember.js location API:
App.Router.reopen({
location: 'history'
});
И затем настройте веб-сервер для перенаправления трафика на приложение Ember.
Чтобы дать конкретный пример, это базовый файл Apache .htaccess
, перенаправляющий трафик на приложение Ember, расположенное в index.html:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.html#$1 [L]
Как Алекс Уайт указывает, что Apache 2.2.16 и выше поддерживает более простую конфигурацию для перенаправления трафика на одну цель:
FallbackResource /index.html
FallbackResource является частью модуля mod_dir
и требует установки AllowOverride Indexes
.
Обязательно тщательно протестируйте маршруты приложения. Одной из распространенных ошибок является Uncaught SyntaxError: Unexpected token <
, которая вызвана использованием относительных ссылок на файлы CSS и JS. Подготовьте их с меткой /
, чтобы сделать их абсолютными.
Эта функциональность не поддерживается в Internet Explorer < 10.
Ответ 2
Лучше, чем RewriteRule, вы можете использовать это для Apache 2.2.16 +:
FallbackResource /index.html
в вашей конфигурации Apache, чтобы RewriteRule не запускался для каждого запроса. Это гарантирует, что каждый маршрут в вашем приложении ember попадает в файл index.html.
Ответ 3
@Pascal: Он не говорит о фактических обновлениях страницы, а использует Ember history
(location: 'history'
).
Чтобы ответить на ваш вопрос, вам нужно настроить свой .htaccess для обслуживания содержимого, как обычно, для JavaScript. После того, как ваши URL-адреса настроены для загрузки вашего приложения, Ember позаботится обо всем, как обычно, с URL-адресом.
Ответ 4
Да, вам нужно будет иметь соответствующие маршруты на стороне сервера. Не использовать хэш-тег также заставит перезагружать страницу, замедляя работу и, вероятно, вызывая больше обновлений, чем нужно.
Кроме того, вам нужно будет передать состояние через сервер или использовать какой-либо вариант локального хранилища браузера.