apache mod_rewrite эквивалент для node.js? - PullRequest
9 голосов
/ 05 мая 2011

Существует ли эквивалентный модуль для Node.js, который делает то, что делает Apache mod_rewrite? или есть стандартная языковая конструкция, обеспечивающая эквивалентную функциональность?

Я только начинаю работать с Node и хочу преобразовать свой сервер в эту платформу.

Ответы [ 5 ]

3 голосов
/ 02 августа 2013

Если вы ищете хорошую библиотеку modrewrite. Возможно, вы захотите взглянуть на connect-modrewrite

3 голосов
/ 05 мая 2011

Если у вас есть HTTP-сервер, работающий с NodeJS, у вас есть 2 объекта: запрос и ответ. Запрос содержит запрошенный URL. Используя require ('url'), вы можете проанализировать этот запрошенный URL и, например, получить запрашиваемый путь.

То, что вы тогда делаете с этим, очевидно, зависит от вашего собственного кода. Поэтому, основываясь на примере по умолчанию на www.nodejs.org, вы получите что-то вроде этого:

var http = require('http');
http.createServer(function (req, res) {
  var requestedURL = require('url').parse( req.url );
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write( "You requested " + requestedURL.pathname + "\n" );
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");

Что вы можете проверить с помощью http://127.0.0.1:1337/foo/bar. Где вы можете использовать requestedURL.pathname, чтобы определить, что вы хотите сделать, в идеале вы должны создать свою собственную - или использовать стороннюю - библиотеку маршрутизации. Они доступны, ExpressJS - довольно известная инфраструктура NodeJS, которая может помочь вам позаботиться о многих вещах, но я сам не имею опыта в этом.

Дополнительная информация:

2 голосов
/ 05 мая 2011

Как следует из предыдущих ответов, вам нужно написать это самостоятельно;оба предыдущих ответа были в большей степени ориентированы на обработку различных путей.

Может оказаться полезным мой обратный прокси-узел , поскольку в нем много кода для обработки правил перезаписи.Это отличается от предыдущих ответов, поскольку позволяет сопоставить правило, такое как "/ people / ([az] *)", и перенаправить на "/cgi-bin/index.cgi?user=$1", что очень похожек mod_rewrite.

0 голосов
/ 09 июня 2017

Есть модуль перезаписи. И при использовании с другим прокси-модулем в промежуточном программном обеспечении они работают вместе как обратный прокси.

Я использую их при разработке одностраничных приложений в своем локальном окне (поэтому мне не нужно настраивать apache / nginx локально)

Это делается для того, чтобы избежать CORS и отправить все страницы (кроме js / css / images) в index.html для работы SPA.

var connect = require('connect');
var modRewrite = require('connect-modrewrite');
var proxy = require('proxy-middleware');
var url = require('url');


var app = connect()
  .use(modRewrite([
    "^\/api\/(.*)        /send-to-api/api/$1    [L]",
    "^(.*)\/css\/(.*)    /send-to-ui/css/$2     [L]",
    "^(.*)\/js\/(.*)     /send-to-ui/js/$2      [L]",
    "^(.*)\/images\/(.*) /send-to-ui/images/$2  [L]",
    "^(.*)\/fonts\/(.*)  /send-to-ui/fonts/$2   [L]",
    "^(.*)               /send-to-ui/index.html [L]"
  ]))
  .use('/send-to-api', proxy(url.parse('http://api.server.dev/'))) // Don't forget the last backslash
  .use('/send-to-ui',  proxy(url.parse('http://ui.server.dev/' ))) // Don't forget the last backslash
  .listen(9000)

Убедитесь, что я использую флаг [L], потому что я хочу, чтобы он переписал и пропустил остальные правила.

В этом случае только /api URL-адреса получают прокси на api.server.dev, остальные - на ui.server.dev. Префиксы url /send-to-api и /send-to-ui являются временными, и я использую их для разграничения того, что и куда пойдет, оно удаляется connect перед отправкой на соответствующие серверы.

И да, в случае перенаправления, proxy-middleware изменит заголовок Location на localhost:9000

0 голосов
/ 05 мая 2011

Если вы ищете эквивалент (хотя технически это не так, потому что маршрутизаторы на самом деле ничего не «переписывают»), существует несколько маршрутизаторов.В частности, маршрутизатор Connect (на котором построен Express): https://github.com/senchalabs/connect

Это будет выглядеть примерно так:

app.get('/', function(req, res) {
  res.end('hello, here is the home page.');
});

Возможно, было бы лучше возиться с нижним уровнемВпрочем, сначала интерфейс http, чтобы почувствовать его.

...