2016-12-21 43 views
39

Mam ogromny problem z routingiem kątowym.Kątowa Wszystkie ukośniki w adresie URL zostały zmienione na% 2F

Do niedawna wszystko było w porządku z następującej trasie:

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

i używając href:

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

Jednak teraz wszystkie ukośniki są zakodowane w% 2F.

Więc po kliknięciu w link lub wpisz localhost: 8000/#/album/1 do przeglądarki adres URL zmienia się na:

http://localhost:8000/#%2Falbum%2F1 

Próbowałem kilka rzeczy do poprawienia w ten sposób:

Używanie ng-href zamiast href, Nieużywanie pierwszego/(np. Href = "#/album/{{album.id}}") Uruchamianie aplikacji w Homestead localhost (maszyna linux vagrant firmy Laravel) zamiast localhost na Windows 10

Każda pomoc byłaby muc h doceniane!

+0

Próbowałem również używać pełnego adresu URL w href (i ng-href), bez zmian – MC123

+0

używają go w html5mode? –

+1

$ locationProvider.html5Mode ({ włączone: true, requireBase: false }); – MC123

Odpowiedz

65

%2F jest percent-encoding do przodu-slash / znak.

Ten problem jest związany z faktem, że AngularJS 1.6 zmieniło domyślne adresy URL hash-bang w usłudze $location.

Aby powrócić do poprzedniego zachowania:

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

Aby uzyskać więcej informacji, zobacz SO: angularjs 1.6.0 (latest now) routes not working.

+0

Przejrzałem kilka wątków na ten temat i wydaje się, że to jedyna odpowiedź. –

+0

to zadziałało dla mnie – pepitomb

+0

Nie działa w IE 11 –

0

Usuń symbol hash z linku, ponieważ używasz html5mode nie trzeba symbol hash dla routingu

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

staje

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

Po prostu spróbowałem - technicznie rozwiązało problem nie kodowania ukośników, ale pod koniec dnia potrzebuję # tam (inaczej Laravel poradzi sobie z trasą/album/1 i daj 404, jako że jest to SPA) – MC123

+0

Próbowano również z ng-href – MC123

+0

Czy możesz spróbować z # ale ustawić html5mode na false i requireBase na true? –

16

Najprostszym rozwiązaniem jest dodanie ! do adresów URL po stronie klienta (jeśli nie korzystasz z trybu HTML5, co prawdopodobnie zrobisz, jeśli tu jesteś).

po stronie klienta, aktualizacja URLS takie jak ten:

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

A skoro trzymasz # istnieje nr kwestia konfliktu z po stronie serwera routingu. Wszyscy są szczęśliwi.

+0

Dzięki! To działało dla mnie, ale ... co dokładnie robi '!'? –

+3

'! #' (Poprzednio tylko '#') jest konwencją zdefiniowaną przez Angular dla oddzielenia routingu po stronie serwera od routingu po stronie klienta. Na przykład zaczynając od tego adresu 'foo.com/app #!/Home', jeśli przejdziesz do adresu URL' foo.com/app #!/Profile', nie zobaczysz przeładowania strony. Jest to aplikacja Angular (działająca w przeglądarce po stronie klienta), która aktualizuje zawartość strony 'home' na stronę' profile', ponieważ zmieniłeś URL ** po ** ''! '. Zamiast tego, jeśli przejdziesz do 'foo.com/otherstuff', będziesz przed' #! ', Więc poprosisz serwer o nową stronę' otherstuff' – Overdrivr

6

Nieco późno na imprezę, ale dodanie "!" do adresów URL będzie działać dobrze. Trochę mi to też przeszkadzało. Jest to zmiana w najnowszym AngularJS 1.6.x i czytałem gdzieś, że Google wymaga SPA, aby "!" po haszowaniu. W rezultacie moje trasy wyglądają tak, jak powinny, ale moja nawigacja upewnia mnie, że dodaję "!" w moich referencjach. Na przykład:

<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> 

Mam nadzieję, że ci to pomoże.

Pozdrawiam!

+0

dzięki .. pomógł – Rica

+0

i podążałem za wieloma innymi sugestiami o którym wspomniano, używająC#/page2. Dziękuję za !. –

2

dla mnie, problem został rozwiązany za pomocą roztworu @Igor Simic i @Umer Z:

app.config(function($locationProvider) { 

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

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

Która daj: http://blablabla.co:8888/blabla#/mylink/

Mam nadzieję, że ta pomoc.