AngularJS Все косые черты в URL изменены на% 2F

46

У меня проблема с AngularJS routing.

До недавнего времени все было в порядке со следующего маршрута:

$routeProvider.when('/album/:albumId', {
    controller: 'albumPageController',
    templateUrl: 'views/album.html'
});

и используя href:

<a href="/#/album/{{album.id}}">Link</a>

Однако теперь все косые черты кодируются в %2F.

Поэтому, когда я нажимаю ссылку или localhost:8000/#/album/1 в браузере, URL-адрес изменяется на:

HTTP://локальный: 8000/#% 2Falbum% 2F1

Я пробовал несколько вещей, чтобы исправить это:

Использование ng-href вместо href, Не использование первого/(т. href="#/album/{{album.id}}") Запуск приложения в Homestead localhost (Laravel linux vagrant machine) вместо localhost в Windows 10

Любая помощь приветствуется!

Показать ещё 3 комментария
Теги:
href
angularjs-1.6

6 ответов

73
Лучший ответ

%2F - это процентное кодирование для символа forward-slash /.

Эта проблема связана с тем, что AngularJS 1.6 изменил значение по умолчанию для URL-адресов хеширования в службе определения $location.

Чтобы вернуться к предыдущему поведению:

appModule.config(['$locationProvider', function($locationProvider) {
  $locationProvider.hashPrefix('');
}]);

Дополнительную информацию см. В разделе SO: angularjs 1.6.0 (последние сейчас) маршруты не работают.

  • 0
    Я рассмотрел несколько тем по этому поводу, и это, кажется, единственный ответ.
  • 0
    это сработало для меня
Показать ещё 1 комментарий
21

Самое простое решение - добавить ! к URL-адресам на стороне клиента (если вы не используете режим HTML5, что вы, вероятно, делаете, если вы здесь).

На стороне клиента обновите URL-адреса следующим образом:

#/foo/bar > #!/foo/bar

И так как вы храните #, нет проблем с конфликтом с маршрутизацией на стороне сервера. Все счастливы.

  • 0
    Спасибо! Это сработало для меня, но ... что именно ! делает?
  • 4
    !# (Ранее только # ) - это соглашение, определенное Angular для отделения маршрутизации на стороне сервера от маршрутизации на стороне клиента. Например, начиная с этого адреса foo.com/app#!/home , если вы перейдете по URL-адресу foo.com/app#!/profile , вы не увидите перезагрузку страницы. Это приложение Angular (работает в вашем браузере на стороне клиента), которое будет обновлять содержимое с home страницы до страницы profile , потому что вы изменили URL после #! , Вместо этого, если вы перейдете на foo.com/otherstuff , вы будете перед foo.com/otherstuff #! так что вы будете просить сервер с новой страницы otherstuff
8

Немного поздно вечеринке, но добавив '!' к вашим URL-адресам будет работать нормально. Меня это тоже беспокоило. Это изменение в последнем AngularJS 1.6.x, и я где-то читал, что Google требует, чтобы у SPA были такие "!" после хеша. В результате мои маршруты выглядят так, как они должны, но моя навигация позволяет добавить "!" в моих рекомендациях. Например:

<ul>
    <li><a href="#!/">Home</a></li>
    <li><a href="#!/page2">Page 2</a></li>
    <li><a href="#!/page3">Page 3</a></li>
    <li><a href="#!/page4">Page 4</a></li>
</ul>

Я надеюсь, это поможет вам.

С уважением!

  • 0
    спасибо .. это помогло
  • 0
    и я следовал за многими другими предложениями, которые упоминались, используя # / page2. Спасибо за !.
3

Для меня я исправил проблему:

app.config(function($locationProvider) {

$locationProvider.hashPrefix('');
$locationProvider.html5Mode({
    enabled: false,
    requireBase: true
  });
});

<a href="#/mylink/"> <span>MyLink</span></a>

Что дает: http://blablabla.co:8888/blabla#/mylink/

Надеюсь, это поможет.

2

косую черту можно отключить:

$urlMatcherFactoryProvider.type('SlashFix', {
  raw:    true,
});


$stateProvider
      .state('content',{
       url: '/{slug:SlashFix}'
       ...

      })

как описано здесь https://www.coditty.com/code/angular-ui-router-replacing-slash-with-2f-quick-fix

0

Удалите хеш-символ из ссылки, так как вы используете html5mode, вам не нужен символ хеша для маршрутизации

<a href="/#/album/{{album.id}}">Link</a>

становится

<a href="/album/{{album.id}}">Link</a>
  • 0
    Только что попробовал - технически это решило проблему не кодирования слешей, но в конце дня мне нужно # там (иначе Laravel будет иметь дело с маршрутом / album / 1 и даст 404, так как это SPA)
  • 0
    Также пробовал с нг-href
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню