Я тоже хотел этого, поэтому я быстро выполнил 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()
в течение нескольких секунд, и проверить весь путь, но он несколько длиннее.
Я бы скорее попытался гарантировать согласованность пути к файлу. Если запрошенный файл «image.jpeg», не называйте его «Image.jpeg». Что-то мешает вам это делать? –
Намерение, безусловно, будет соответствовать случаю, но эта несогласованность в поведении означает, что наша инфраструктура уязвима для ошибок опечаток/разработчиков и что проблемы не подбираются до развертывания кода. Я либо хочу, чтобы код выполнялся как локально, так и на сервере, или выполнялся локально и на сервере. –
'serve-static' не имеет возможности указывать чувствительность к регистру (что может быть сложно реализовать на некоторых платформах, как вы уже упоминали). Лучше всего делать интеграционные тесты, которые охватывают процесс работы вашего статического файла на вашем сервере. –