ms-dred
@ms-dred
Вечно что то не то и что то не так...

Не проходит пост запрос на поддомен (Access-Control-Allow-Origin), как решить проблему?

У меня есть поддомен который расположен на другом сервере, этот поддомен принимает запросы за загрузку фотографий, оба домена на 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
                        }
                    })
  • Вопрос задан
  • 2501 просмотр
Решения вопроса 1
ms-dred
@ms-dred Автор вопроса
Вечно что то не то и что то не так...
Проблема была с Nginx
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Чтобы разрешить обращение с любого домена добавьте в самое начало файла:
header('Access-Control-Allow-Origin: *');

Чтобы разрешить обращение только с вашего, добавьте в самое начало файла:
header('Access-Control-Allow-Origin: http://yourdomain.ru');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 11:47
30000 руб./за проект
18 апр. 2024, в 11:46
5000 руб./за проект
18 апр. 2024, в 11:43
10000 руб./за проект