2016-04-25 3 views
3

Как установить, является ли маршрутизация для express.static чувствительной к регистру? например должен ли Express обрабатывать запрос для image.jpeg, обслуживая локальный файл с именем Image.jpeg.Чувствительность к регистру Node.js Экспресс статических активов

При вызове express.Router([options]) (опция определена как http://expressjs.com/en/4x/api.html) существует опция чувствительного к случаю случая, но при вызове (документация по той же ссылке) это не вариант.

По умолчанию, я получаю различное поведение, обслуживающее статические файлы из нечувствительных к регистру томов (/ Mac OS X) для точных томов (/ Linux). Это приводит к непоследовательным ошибкам в нашем приложении - где-то с несоответствием случаев работает локально в Mac OS X, но при развертывании на сервере Linux он не работает.

+0

Я бы скорее попытался гарантировать согласованность пути к файлу. Если запрошенный файл «image.jpeg», не называйте его «Image.jpeg». Что-то мешает вам это делать? –

+3

Намерение, безусловно, будет соответствовать случаю, но эта несогласованность в поведении означает, что наша инфраструктура уязвима для ошибок опечаток/разработчиков и что проблемы не подбираются до развертывания кода. Я либо хочу, чтобы код выполнялся как локально, так и на сервере, или выполнялся локально и на сервере. –

+0

'serve-static' не имеет возможности указывать чувствительность к регистру (что может быть сложно реализовать на некоторых платформах, как вы уже упоминали). Лучше всего делать интеграционные тесты, которые охватывают процесс работы вашего статического файла на вашем сервере. –

ответ

1

Я получил также несколько советов для простого альтернативного решения:

Установить политику, что все статические файлы и пути должны быть в нижнем регистре .

Внедрение политики в файлах путем добавления шага сборки, который их проверяет.

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

1

Я тоже хотел этого, поэтому я быстро выполнил 404 запроса с несоответствующим случаем.

Это не особенно эффективно, поэтому я запускаю его только в разработке. Он проверяет только имя файла. Он не проверяет папку с папками над файлом.

Как использовать:

var express = require('express'); 

var app = express(); 
// You can do this before or after the express() call 
// But it must come before express.static() is called 
var inDevelopment = (process.NODE_ENV || 'local') === 'local'; 
if (inDevelopment) { 
    require('./modules/makeExpressStaticCaseSensitive')(express); 
} 

app.use(express.static(path.join(__dirname, 'public_html'))); 

Сценарий module/makeExpressStaticCaseSensitive.js

module.exports = function (express) { 
    var fs = require('fs') 
    var pathlib = require('path'); 
    var parseUrl = require('express/node_modules/parseurl') 

    var oldStatic = express.static; 
    var newStatic = function (root, options) { 
     var opts = Object.create(options || null); 

     var originalHandler = oldStatic(root, options); 

     var wrappedHandler = function (req, res, next) { 
      var filepath = pathlib.join(root, parseUrl(req).pathname); 
      var dirpath = pathlib.dirname(filepath); 
      var filename = pathlib.basename(filepath); 

      // @todo Reading the entire directory listing and then searching it is quite inefficient for large folders 
      //  We should find a more efficient way to do this for one file at a time 
      fs.readdir(dirpath, function (err, files) { 
       if (err) return next(err); 

       var fileIsThere = files.indexOf(filename) >= 0; 
       if (fileIsThere) { 
        originalHandler(req, res, next); 
       } else { 
        res.status(404).end(); 
       } 
      }); 
     }; 

     return wrappedHandler; 
    }; 
    express.static = newStatic; 
}; 

Я написал более эффективную версию, которая кэширует выход readdir() в течение нескольких секунд, и проверить весь путь, но он несколько длиннее.

Смежные вопросы