2012-10-26 5 views
7

다트의 경우 awesome.html이 있지만 /awesome이되고 싶습니다. 이건 순전히 .htaccess (아파치를 사용하고 있습니다)일까요, 아니면 다트 또는 "현대 웹 개발"방식으로 갈 수있는 방법이 있습니까?Dart와 다른 URL의 정적 파일을 어떻게 처리합니까?

.htaccess 비트 /awesome/awesome.html에 지시 :

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.+)/$ $1.html [L] 

그러나 내 모든 상대 URL 참조 브레이크 (CSS/JS/이미지), 나는 그들을 다시 작성하는 경우 "자산/무엇"을 "/ DAY 편집기에서 다음과 같은 URL을 사용하기 때문에 중단 될 것입니다.

http://127.0.0.1:3030/Users/dave/Sites/my-dart-app/web/awesome.html 

아이디어가 있습니까? 모범 사례? 고맙습니다!

+2

프레임 워크가 많은 도움이 될 것으로 저는 믿습니다. 현재 로선이 작업을 수행하는 간단한 방법이 없으므로 라우팅 시스템이 필요합니다. 나는 실제로 하나에 대해 작업하고 있지만 아직 준비가되지 않았습니다. –

+0

다트 서버 측 응용 프로그램에 대해 이야기하고 있다고 가정합니까? –

+0

@SethLadd, 지금 바로 간단한 클라이언트 측 페이지 집합입니다. 아래 답변 에서처럼 페이지를 제공하는 방식으로 펑키 한 서버 측 응용 프로그램이 필요할 것입니다. –

답변

4

질문 주셔서 감사합니다!

답변은 Dart 서버 VM 앞에 프록시 또는 웹 서버가 있는지 여부에 따라 달라집니다. 프락시가 있으면 프락시는 요청이 다트 VM에 도착하기 전에 URL 재 작성을 할 수 있습니다. 어쨌든 프록시는 캐싱, SSL,로드 균형 조정 등을 수행 할 수 있기 때문에 좋은 시나리오입니다. Dart VM은이 시나리오에서 단지 "응용 프로그램 서버"입니다. 업계 최고의 웹 서버 또는 프록시를 모범 사례로 앞에 두는 것이 좋습니다.

그러나 URL 마스킹을 수행하고 순전히 다트로 다시 작성하려는 경우 여기에 몇 가지 코드가 있습니다. Kai가 위의 의견에서 말했듯이, 이것은 일반적으로 프레임 워크의 일입니다. 어쨌든 재미로 여기에 몇 가지 코드를 포함 할 것입니다. :) 그런데

import 'dart:io'; 
import 'dart:json'; 

class StaticFileHandler { 
    final String basePath; 

    StaticFileHandler(this.basePath); 

    _send404(HttpResponse response) { 
    response.statusCode = HttpStatus.NOT_FOUND; 
    response.outputStream.close(); 
    } 

    String rewritePath(String path) { 
    String newPath = path; 

    if (path == '/' || path.endsWith('/')) { 
     newPath = '${path}index.html'; 
    } else if (!path.endsWith('.html')) { 
     newPath = "${path}.html"; 
    } 

    return newPath; 
    } 

    // TODO: etags, last-modified-since support 
    onRequest(HttpRequest request, HttpResponse response) { 
    String path = rewritePath(request.path); 

    final File file = new File('${basePath}${path}'); 
    file.exists().then((found) { 
     if (found) { 
     file.fullPath().then((String fullPath) { 
      if (!fullPath.startsWith(basePath)) { 
      _send404(response); 
      } else { 
      file.openInputStream().pipe(response.outputStream); 
      } 
     }); 
     } else { 
     _send404(response); 
     } 
    }); 
    } 

} 

runServer(String basePath, int port) { 
    HttpServer server = new HttpServer(); 

    server.defaultRequestHandler = new StaticFileHandler(basePath).onRequest; 
    server.onError = (error) => print(error); 
    server.listen('127.0.0.1', 1337); 
    print('listening for connections on $port'); 
} 

main() { 
    var script = new File(new Options().script); 
    var directory = script.directorySync(); 
    runServer("${directory.path}", 1337); 
} 
+0

세스 고마워요! 채팅 앱에서 코드를 인식합니다. 예, 당신이 말하는 것처럼 "강점을 지닌 웹 서버 또는 프록시"와 함께 가고 싶습니다. 프록시와 웹 서버의 차이를 이해하도록 도와 줄 수 있습니까? 어떤 프록시 또는 웹 서버를 추천 하시겠습니까? 오랜 시간 동안 램프를 사용 해본 적이있어서 아파치가 익숙해졌지만 서버 쪽 스택 인 Dart에 대한 권장 사항이 있습니까? –

+2

나는 "당신이 아는 것과 함께"라고 말하고, 아파치는 프록시 역할을 할 수 있습니다. Apache 또는 nginx가 원시 정적 파일을 제공하는 데 더 많은 성능을 제공 할 가능성이 있지만 테스트되지 않은 게스트입니다. 그러면 Dart VM이 "앱 서버"로 남게됩니다. –

+2

세스의 마지막 코멘트를 확장하기 위해 아파치와 nginx는 정적 폴더를 제공하는 것이 더 빠르다. (적어도 순간적으로) 아파치가 메모리 내에서 더 작은 정적 파일을 캐시하기는 어렵지만, 아파치는 구문 분석과 같은 어리석은 일을한다. htaccess' 파일은 요청이 올 때마다 반복적으로 발생합니다. 개인적으로 정적 파일을 제공하기 위해 nginx 나 Dart를 사용하는 것을 권하고 싶지만 이것은 제 의견입니다. –

0

, 나는 그것을 .html로하는 .dart 및 .CSS 파일과 같은 자산을 재 작성하지 않도록 세스의 코드 일부를의 RewritePath() 함수를 업데이트하고, 그래서 작동 한/web에 살고있는 클라이언트 측 물건들.

String rewritePath(String path) { 
    String newPath = path; 

    if (path == '/' || path.endsWith('/')) { 
     newPath = '/web${path}index.html'; 
    } else if (!path.endsWith('.html')) { 
     if (path.contains('.')) { 
     newPath = '/web${path}'; 
     } else { 
     newPath = '/web${path}.html'; 
     } 
    } else { 
     newPath = '/web${path}.html'; 
    } 

    //peek into how it's rewriting the paths 
    print('$path -> $newPath'); 

    return newPath; 
    } 

은 물론 슈퍼 기본이고, 라우팅을 처리하는 프레임 워크는 확실히 (이 @Kai을 구축하는지보고 싶어요) 편리합니다.

관련 문제