2016-12-21 4 views
39

각도 라우팅에 심각한 문제가 있습니다. 최근에 모든 것을까지각도 URL의 모든 슬래시가 % 2F (으)로 변경되었습니다.

는 다음과 같은 경로로 잘하고있다 :

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

과 HREF를 사용하여 :

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

그러나, 지금 슬래시의 모든 %의 2 층으로 인코딩되고있다. 나는이 문제를 해결하기 위해 여러 가지를 시도했습니다

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

:

그래서 링크, 또는 localhost를 입력 클릭 할 때 : 브라우저에 8000/#/앨범/1 URL이 변경됩니다

href 대신 ng-href 사용 첫 번째/즉 href = "#/album/{{album.id}}"를 사용하지 않음 Homestead localhost (Laravel의 리눅스 매독기) 대신 Windows 10의 로컬 호스트

어떤 도움도 muc가됩니다. 고맙다! 당신이

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

라우팅 해시 기호가 필요하지 않습니다 당신이 html5mode을 사용하고 있기 때문에

+0

href (및 ng-href)의 전체 URL을 사용하여 변경했는데 – MC123

+0

은 html5mode에서 변경 사항을 사용하고 있습니까? –

+1

$ locationProvider.html5 모드 ({ 사용 : true, requireBase : false }); – MC123

답변

65

%2F이 슬래시의 percent-encoding이다되고, 링크에서 해시 기호를 제거 / 문자.

이 문제는 AngularJS 1.6이 $location 서비스의 해시 - 뱅 URL에 대한 기본값을 변경 한 것과 관련이 있습니다.

는 이전 동작으로 되돌리려면 :

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

자세한 내용은 SO: angularjs 1.6.0 (latest now) routes not working를 참조하십시오.

+0

나는 이것에 관해 여러 스레드를 검토했으며 이것이 유일한 대답 인 것 같습니다. –

+0

이것은 나를 위해 일했습니다 – pepitomb

+0

IE 11에서 작동하지 않습니다 –

0

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

그냥 시도 - 그것은 슬래시를 인코딩하지 않는 문제를 기술적으로 해결했지만 하루가 끝날 때 #가 필요합니다 (그렇지 않으면 Laravel은 경로/앨범/1 및 SPA로 404 제공) – MC123

+0

또한 ng-href로 시도했습니다. – MC123

+0

#로 시도 할 수 있지만 html5mode를 false로 설정하고 requireBase를 true로 설정할 수 있습니까? –

16

가장 간단한 해결책은 클라이언트 측 URL에 !을 추가하는 것입니다 (HTML5 모드를 사용하지 않는 경우 여기에있는 경우 가능).

클라이언트 측이 같은 URL 업데이트 :

> #!/foo/bar

#/foo/bar 그리고 당신이 #을 유지하기 때문에, 서버 측 라우팅과 충돌없이 문제가 있습니다. 모두 행복합니다.

+0

고마워요! 이것은 나를 위해 일했지만 ... 정확히'! '는 무엇을합니까? –

+3

'! #'(이전에'#'만 사용)은 서버 측 라우팅을 클라이언트 측 라우팅과 분리하기 위해 Angular로 정의 된 규칙입니다. 예를 들어,이 주소 'foo.com/app #!/home'에서 시작하여'foo.com/app #!/profile' URL로 이동하면 페이지가 다시로드되지 않습니다. ** 홈 페이지에서'profile! '페이지로 이동 한 것은 Angular app (브라우저에서 클라이언트 측에서 실행 중입니다.)입니다. '. 대신에'foo.com/otherstuff'에 가면'#!'전에 새로운 페이지'otherstuff'로 서버를 요청할 것입니다 – Overdrivr

6

파티가 좀 늦었지만 '!' 귀하의 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

덕분에 .. – Rica

+0

을 도와 주었고 다른 많은 제안을 따랐습니다 #/page2를 사용하여 언급했습니다. 감사합니다! –

2

설명

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


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

     }) 

, 나는 @Igor 시믹 및 @Umer Z 용액 문제 해결 :

app.config(function($locationProvider) { 

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

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

을 어느 give : http://blablabla.co:8888/blabla#/mylink/

희망이 도움이됩니다.