Как мне обслуживать статические файлы с другого URL с помощью Dart?

С Дартом яу нас естьawesome.html, но я'мне бы хотелось, чтобы это было/awesome, Это чисто.htaccess (Я'Я использую Apache), или есть ли способ сделать это Дарт или "современная веб-разработка » путь?

это.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) прерываются, и если я переписываю их изактивы / все» к "/ активы / все» Это'сломается при работе в редакторе дротиков, так как он использует такие URL, как:

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

Идеи? Лучшие практики? Спасибо!

 Seth Ladd26 окт. 2012 г., 16:55
Я полагаю, выговорите о серверном приложении Dart?
 David Notik26 окт. 2012 г., 19:01
@SetLadd, этоЭто просто набор простых клиентских страниц прямо сейчас, хотя я понимаю, чтоВам понадобится приложение на стороне сервера, чтобы получить фанки от того, как я обслуживаю страницы, как в вашем ответе ниже.
 Kai Sellgren26 окт. 2012 г., 09:21
Я полагаю, что рамки очень помогли бы здесь. В настоящее время простого способа сделать это не существует, поэтому необходима система маршрутизации. Я'Я на самом деле работаю над одним, но этоеще не готов

Ответы на вопрос(2)

кодировать некоторые так, чтобы это непереписать ресурсы, такие как файлы .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-сервера. Если у вас впереди прокси-сервер, он может переписать URL-адрес до того, как запрос попадет на виртуальную машину Dart. В любом случае, это хороший сценарий, потому что прокси-сервер может выполнять кэширование, SSL, балансировку нагрузки и многое другое. Dart VM - это простосервер приложений " в этом сценарии. Я бы порекомендовал разместить передовой промышленный веб-сервер или прокси-сервер.

Однако, если вы хотите сделать маскировку URL и переписать чисто в Dart, вот код. Как говорит Кай в комментариях выше, это, как правило,с работой. Но я'Я добавлю сюда код для развлечения. :)

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);
}
 Seth Ladd27 окт. 2012 г., 02:17
скажу "иди с тем, что знаешьи Apache может выступать в качестве прокси. Это'Возможно, что Apache или nginx более производительны в обслуживании необработанных статических файлов, но этонепроверенный гость. Это оставило бы вашу Dart VM как вашуСервер приложений ".
 Kai Sellgren27 окт. 2012 г., 13:06
Продлить СетПоследний комментарий: Apache и nginx быстрее обслуживают статические папки (по крайней мере, на данный момент), хотяСложно заставить Apache кэшировать статические файлы меньшего размера в памяти, а Apache делает такие глупые вещи, как анализ.htaccess файлы рекурсивно каждый раз, когда приходит запрос. Лично яя бы рекомендовал использовать nginx или Dart для обслуживания статических файлов, но этоПросто мое мнение.
 David Notik26 окт. 2012 г., 19:11
Спасибо, Сет! Я узнаю этот код из приложения чата. Да, я думаю, что я хочу пойти свеб-сервер промышленного уровня или прокси впереди » как ты говоришь. Можете ли вы помочь мне понять разницу между прокси и веб-сервером? Какой прокси или веб-серверы вы бы порекомендовали? Я давний LAMP, так что Apache - это то, что яя привык, но есть ли рекомендации для стека на стороне сервера с Dart?

Ваш ответ на вопрос