У меня сложилось впечатление, что Angular переписывает URL-адреса, которые появляются в атрибутах href тегов привязки внутри шаблонов, так что они будут работать либо в режиме html5, либо в режиме hashbang. Документация на услуги определения местоположения , кажется, говорят , что HTML Link Rewriting заботится о ситуации hashbang. Таким образом, я ожидаю, что когда не в режиме HTML5, будут вставлены хэши, а в режиме HTML5 - нет.
Тем не менее, кажется, что переписывание не происходит. Следующий пример не позволяет мне просто изменить режим. Все ссылки в приложении должны быть переписаны вручную (или получены из переменной во время выполнения. Требуется ли вручную переписывать все URL-адреса в зависимости от режима?
Я не вижу переписывания URL на стороне клиента в Angular 1.0.6, 1.1.4 или 1.1.3. Кажется, что все значения href должны начинаться с # / для режима hashbang и / для режима html5.
Есть ли какая-то конфигурация, необходимая для перезаписи? Я неправильно читаю документы? Делать что-то еще глупо?
Вот небольшой пример:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Приложение: перечитывая мой вопрос, я вижу, что использовал термин «переписывание» без излишней ясности в отношении того, кто и когда хотел переписать. Вопрос заключается в том, как заставить Angular переписывать URL-адреса при рендеринге путей, и как заставить его интерпретировать пути в коде JS равномерно в двух режимах. Речь идет не о том, как заставить веб-сервер выполнять совместимое с HTML5 переписывание запросов.
источник
Ответы:
В документации не очень ясно про маршрутизацию AngularJS. Это говорит о Hashbang и режиме HTML5. Фактически, маршрутизация AngularJS работает в трех режимах:
Для каждого режима существует соответствующий класс LocationUrl (LocationHashbangUrl, LocationUrl и LocationHashbangInHTML5Url).
Чтобы смоделировать перезапись URL-адреса, вы должны установить для html5mode значение true и украсить класс $ sniffer следующим образом:
Теперь я объясню это более подробно:
Hashbang Mode
Конфигурация:
Это тот случай, когда вам нужно использовать URL-адреса с хэшами в ваших HTML-файлах, например, в
В браузере вы должны использовать следующую ссылку:
http://www.example.com/base/index.html#!/base/path
Как вы можете видеть в чистом режиме Hashbang, все ссылки в файлах HTML должны начинаться с базы, такой как «index.html #!».
Режим HTML5
Конфигурация:
Вы должны установить базу в HTML-файле
В этом режиме вы можете использовать ссылки без # в файлах HTML
Ссылка в браузере:
Hashbang в режиме HTML5
Этот режим активируется, когда мы фактически используем режим HTML5, но в несовместимом браузере. Мы можем смоделировать этот режим в совместимом браузере, украсив службу $ sniffer и установив для истории значение false.
Конфигурация:
Установите базу в HTML-файл:
В этом случае ссылки также могут быть записаны без хэша в HTML-файле.
Ссылка в браузере:
источник
$provide
не определено?Будущие читатели, если вы используете Angular 1.6 , вам также необходимо изменить
hashPrefix
:Не забудьте установить базу в своем HTML
<head>
:Подробнее о журнале изменений here.
источник
Мне потребовалось некоторое время, чтобы понять, как это работает - Angular WebAPI ASP Routing без # для SEO
Добавьте $ locationProvider.html5Mode (true); в app.config
Мне нужно было игнорировать определенный контроллер (который был в домашнем контроллере) для загрузки изображений, поэтому я добавил это правило в RouteConfig
В Global.asax добавьте следующее - не обращайте внимания на пути загрузки api и загрузки изображений, чтобы они работали как обычно, иначе перенаправьте все остальное.
Убедитесь, что вы используете $ location.url ('/ XXX'), а не window.location ... для перенаправления
Ссылка на файлы CSS с абсолютным путем
и нет
Заключительное замечание - выполнение этого способа дало мне полный контроль, и мне не нужно было ничего делать с веб-конфигурацией.
Надеюсь, это поможет, так как мне понадобилось время, чтобы понять.
источник
Я хотел получить доступ к своему приложению с помощью режима HTML5 и фиксированного токена, а затем переключиться на метод hashbang (чтобы сохранить токен, чтобы пользователь мог обновить свою страницу).
URL для доступа к моему приложению:
http://myapp.com/amazing_url?token=super_token
Затем, когда пользователь загружает страницу:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Затем, когда пользователь перемещается:
http://myapp.com/amazing_url?token=super_token#/another_url
При этом я сохраняю токен в URL и сохраняю состояние, когда пользователь просматривает. Я потерял немного видимости URL, но нет идеального способа сделать это.
Поэтому не включайте режим HTML5, а затем добавьте этот контроллер:
источник