У меня есть поддомен который расположен на другом сервере, этот поддомен принимает запросы за загрузку фотографий, оба домена на https.
При отправке файла с формы в консоле вываливается ошибка
Failed to load https://img.site.com/add_image: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://site.com' is therefore not allowed access. The response had HTTP status code 405.
На поддомене так же стоит Node.js (Express.js), в файле app.js я устанавливаю необходимые заголовки
app.use((request, response, next) => {
const allowedOrigins = [
'http://localhost:3000',
'https://site.com'
]
, origin = request.headers.origin
console.log(origin)
if(allowedOrigins.indexOf(origin) > -1) response.setHeader('Access-Control-Allow-Origin', origin)
response.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS')
response.header('Access-Control-Allow-Headers', 'Cache-Control, X-Requested-With, csrf-token')
response.header('Access-Control-Allow-Credentials', true)
return next()
})
На локальной машине все работает, отправлял файлы с localhost:3000 (основной сайт) на localhost:5000 (сервер с картинками)
С начала подумал проблема с переменной origin, но консолька молчит при POST запросах, отвечает только на GET.
Плюнул, решил создать обработчик для options, он тоже молчит, Nginx режет запросы? Что делать?
Вот файл app.js целиком
const express = require('express')
, config = require('./config')
, app = express()
, logger = require('morgan')
, errors = require('http-errors')
, route = express.Router( { strict: true, caseSensitive: false } )
app.enable('trust proxy')
app.enable('strict routing')
app.enable('case sensitive routing')
app.use((request, response, next) => {
const allowedOrigins = [
'http://localhost:3000',
'https://site.com'
]
, origin = request.headers.origin
console.log(origin)
if(allowedOrigins.indexOf(origin) > -1) response.setHeader('Access-Control-Allow-Origin', origin)
response.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS')
response.header('Access-Control-Allow-Headers', 'Cache-Control, X-Requested-With, csrf-token')
response.header('Access-Control-Allow-Credentials', true)
return next()
})
if(app.get('env') == 'development') {
app.use(logger('dev'))
app.locals.pretty = true;
} else {
app.use(logger('combined', { skip: (req, res) => { return res.statusCode < 404 } }))
app.locals.pretty = '\r';
}
app.use((request, response, next) => {
(request.config = response.locals.config = config), next()
})
app.use(
route.post('/add_image, require('./add_image').post)
)
// catch 404 and forward to error handler
app.use((req, res, next) => {
next(errors(404))
})
// error handler
app.use((e, request, response, next) => {
response.status(e.status || 500)
response.send(e.message)
})
app.listen(config.PORT, (e) => {
if (e) {
return console.log('something bad happened', e)
}
console.log(`server is listening on ${config.PORT}`)
})
Файл add_image.js
exports.post = (request, response, next) => {
console.log('Молчит как рыба об лед')
}
Отправляю данные с Fineuploader
new qq.FineUploader({
debug: true,
element: '#upload',
request: {
endpoint: 'https://img.site.com/add_image',
customHeaders: {
"csrf-token": 'data-csrf'
}
},
cors: {
//all requests are expected to be cross-domain requests
expected: true,
//if you want cookies to be sent along with the request
sendCredentials: true
}
})