2015-01-20 2 views
0

내가 함께 일하고 있어요 하나 개의 웹 애플리케이션에서 기간과 위치 URL의 응용 프로그램 :그런트 : 나는 아래와 같은 URL을 거래를

http://localhost:8080/section/value.with.periods

value.with.periods는 사람처럼 URL의 PARAM입니다 당신은 각도의 routeProvider에 선언

angular.config(['$routeProvider', function ($routeProvider) { 
    $routeProvider 
     .when('/section/:param', { 
      templateUrl: 'url-to-template', 
      controller: 'ExampleCtrl', 
      resolve: { 
       ... 
      } 
     }); 
}]); 

문제는 그런트 작업에서 실행에 사용되는 서버가, 거기에 마침표 URL을 처리 할 수 ​​있다는 것입니다 :

Cannot GET /section/value.with.periods

내가 grunt-contrib-proxyconnect-modrewrite하고 connect-modrewrite를 구성하는 livereload 작업, 함께 그런트 실행 해요

은 아래와 : 나는 기간과 URL을 처리 할 수 ​​있어야합니다

 livereload: { 
      options: { 
       open: 'http://localhost:<%= connect.options.port %>', 
       base: [ 
        '.tmp', 
        '<%= config.app %>' 
       ], 
       middleware: function(connect, options) { 
        if (!Array.isArray(options.base)) { 
         options.base = [options.base]; 
        } 

        // Setup the proxy 
        var middlewares = [proxySnippet]; 

        var modRewrite = require('connect-modrewrite'); 
        middlewares.push(modRewrite(['^[^\\.]*$ /index.html [L]'])); 
        // middlewares.push(modRewrite(['!\\.html|\\.js|\\.svg|\\.css|\\.png|\\.jpg\\.gif|\\swf$ /index.html [L]'])); 


        // Serve static files. 
        options.base.forEach(function(base) { 
         middlewares.push(connect.static(base)); 
        }); 

        // Make directory browse-able. 
        var directory = options.directory || options.base[options.base.length - 1]; 
        middlewares.push(connect.directory(directory)); 

        return middlewares; 
       } 
      } 
     } 

Angular에서 사용되는 매개 변수에 적용됩니다. 어떤 도움을 주시면 감사하겠습니다.

감사합니다.

답변

2

귀하의 재 작성 정규식은에 마침표 모든 경로 제외 :

만큼 의미
^[^\\.]*$ 

: 그들은 백 슬래시 또는 기간이있는 경우를 제외하고, 모든 문자와 URL을 일치합니다. 따라서 /section/value.with.periods은 무시됩니다.

middlewares.push(modRewrite(['^(.*)$ /index.html [L]'])); 

을 그리고 당신이 가서 잘되어야합니다 :

당신은 더 관대 뭔가에 정규식을 변경해야합니다.

편집 솔루션 : 정규식 위에 다른 파일이 제공되지 않는 원인, index.html을하는 모든 URL을 다시 작성합니다 : 우리는 대답에 온 의견

. 알 수없는 파일 확장자로 URL을 다시 쓰는 주석 처리 된 행이 있습니다.

middlewares.push(modRewrite(['!\\.html|\\.js|\\.svg|\\.css|\\.png|\\.jpg|\\.gif|\\.swf$ /index.html [L]'])); 

이렇게하면 원하는 결과를 얻을 수 있습니다. 자세한 정보는 의견보기를 참조하십시오.

+0

정규 표현식을 제안 사항으로 바꿨으므로 앱이 해당 종속성을 찾을 수 없습니다. 그들 모두는 현재'index.html'를 소스로 지정하고 콘솔에 몇 가지 오류를 던집니다. 이 원래 정규식을 수정해야하거나 HTML 태그에 선언 된 파일 경로에만 사용할 경우 생각했습니다. –

+1

아파치의 mod_rewrite처럼 파일이 존재하는지 확인하는 옵션이없는 것 같습니다. 주석 처리 된 버전을 사용해 보셨습니까? 'middlewares.push (modRewrite ([ '! \\ .html | \\ .js | \\ .svg | \\ .css | \\. png | \\. jpg \\ .gif | \\ swf $/index .html [L] '])));' – RoryKoehein

+0

정규 표현식이 최선의 능력이 아닙니다. 예, 주석 처리가되지 않았습니다. 주석이없는 정규 표현식의 가능성을 알지 못했고, 팀의 다른 누군가가 다른 하나를 대신하여이 문제를 일으켰습니다. 답변을 수정하고 설명하며 올바른 것으로 표시 할 수 있습니까? –

관련 문제