2012-10-26 44 views
7

随着Dart,我有awesome.html,但我想它是/awesome。这是纯粹的.htaccess(我使用Apache)的东西,还是有办法去这个飞镖或“现代网络开发”的方式吗?如何使用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 /图片)休息,如果我从它们改写 “资产/不管” 到“/资产/无论什么“在Dart编辑器中工作时会中断,因为它使用以下URL:

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

想法?最佳实践?谢谢!

+2

我相信一个框架在这里会有很大的帮助。就目前来看,没有简单的方法可以做到这一点,所以需要一个路由系统。实际上我正在研究一个,但还没有准备好。 –

+0

我假设你在谈论Dart服务器端应用程序? –

+0

@SethLadd,现在它只是一组简单的客户端页面,尽管我明白我需要一个服务器端应用程序来让我的页面服务更时髦,如下面的答案。 –

回答

4

感谢您的问题!

答案取决于您的Dart服务器VM前是否有代理服务器或Web服务器。如果您有前面的代理,那么代理可以在请求达到您的Dart VM之前进行URL重写。无论如何,这是一个不错的场景,因为代理可以执行缓存,SSL,负载平衡等等。在这种情况下,Dart VM只是一个“应用服务器”。我会建议把一个工业强度的Web服务器或代理放在前面,作为最佳实践。

但是,如果你想在Dart中完成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

谢谢塞斯!我从聊天应用程序中识别出这些代码。是的,我想像你说的那样,我想用“前端的工业强度的Web服务器或代理”。你能帮我理解代理和Web服务器之间的区别吗?你会推荐哪个代理服务器或Web服务器?曾经是一个长期的LAMP人,所以Apache就是我习惯的,但是有服务器端堆栈的推荐吗? –

+2

我会说“随你所知”,Apache可以作为代理。 Apache或nginx可能更高性能的服务原始静态文件,但这是一个未经测试的客户。这会让你的Dart虚拟机成为你的“应用服务器”。 –

+2

为了扩展Seth的最后一条评论,Apache和nginx在服务静态文件夹(至少现在是这样)中速度更快,不过要让Apache缓存内存中较小的静态文件并且Apache做一些愚蠢的事情(比如解析)很困难。每次请求时递归的htaccess'文件。我个人建议使用nginx或Dart来提供静态文件,但这只是我的看法。 –

0

顺便说一句,我已经更新了rewritePath()函数在塞特的一些代码,以便它不重写像.dart和.css文件资产.HTML,所以它的工作原理w /我的客户端的东西生活在/网络。

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