如何使用Dart从不同的URL提供静态文件?

如何使用Dart从不同的URL提供静态文件?,dart,Dart,使用Dart,我得到了awesome.html,但我希望它是/awesome。这纯粹是一个.htaccess(我在使用Apache)的东西,还是有一种方法可以做到这一点,即Dart或“现代web开发”方法 此.htaccess位将/awesome定向到/awesome.html: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301] RewriteCon

使用Dart,我得到了
awesome.html
,但我希望它是
/awesome
。这纯粹是一个
.htaccess
(我在使用Apache)的东西,还是有一种方法可以做到这一点,即Dart或“现代web开发”方法

.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/images)都会中断,如果我将它们从“assets/whatever”重写为“/assets/whatever”,在Dart编辑器中工作时就会中断,因为它使用的URL如下:

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

想法?最佳实践?谢谢大家!

谢谢你的提问

答案取决于Dart服务器VM前面是否有代理服务器或web服务器。如果前面有一个代理,那么代理可以在请求到达Dart VM之前重写URL。无论如何,这是一个不错的场景,因为代理可以执行缓存、SSL、负载平衡等操作。在这种情况下,Dart虚拟机只是一个“应用服务器”。我建议将industrial strength web服务器或代理放在前面,这是一种最佳做法

然而,如果您想纯粹在Dart中进行URL屏蔽和重写,下面是一些代码。正如Kai在上面的评论中所说,这通常是一个框架的工作。但为了好玩,我还是会在这里加入一些代码。:)


顺便说一句,我在Seth的一些代码中更新了rewritePath()函数,这样它就不会将.dart和.css文件之类的资产重写为.html,这样它就可以与/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构建什么)。

我相信一个框架在这里会有很大帮助。目前,没有简单的方法可以做到这一点,因此,需要一个路由系统。我实际上正在开发一个,但它还没有准备好。我想你说的是Dart服务器端应用程序?@SethLadd,它现在只是一组简单的客户端页面,尽管我知道我需要一个服务器端应用程序来让我的页面服务变得时髦,如你下面的回答所示。谢谢你Seth!我从聊天应用程序中识别出该代码。是的,我想我想要像你说的那样“前面有一个工业级的web服务器或代理”。你能帮我理解代理和web服务器之间的区别吗?您会推荐哪种代理服务器或web服务器?我是一个很早就喜欢LAMP的人,所以我习惯使用Apache,但是有没有关于服务器端堆栈w/Dart的建议?我会说“按照你所知道的去做”,Apache可以充当代理。Apache或nginx可能在服务原始静态文件方面性能更好,但这是一个未经测试的客户机。这将使您的Dart VM成为您的“应用服务器”。为了扩展Seth的最后一条评论,Apache和nginx在服务静态文件夹方面更快(至少目前如此),尽管让Apache在内存中缓存较小的静态文件有点困难,而且Apache在每次请求时都会递归地解析
.htaccess
文件等愚蠢的事情。就个人而言,我建议使用nginx或Dart来提供静态文件,但这只是我的观点。
  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;
  }