@yury_borisov

Все заголовки прописаны, но почему No 'Access-Control-Allow-Origin'?

server {
	listen 80;
	set $subdomain domain;
	server_name domain.loc;
        set $index index.php;
	index $index; 
	root /var/www/$subdomain/public/; 
	gzip_comp_level  5;
        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        location @rewrites {
          rewrite ^/(.*)$ /$index last;
        }

        location / { 
         charset utf-8; 
         try_files $uri $uri/ @rewrites;
        }
  
        location ~ \.php$ {
         fastcgi_pass unix://var/run/php/php7.0-fpm.sock;
         fastcgi_index $index;
         fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
         include fastcgi_params;
         break;
        }
} 

server{
        listen 80;
	set $subdomain domain;
	server_name u1.domain.loc;
        set $index index.php;
	index $index; 
	root /var/www/$subdomain/public/; 
        location @rewrites {
          rewrite ^/(.*)$ /$index last;
        }

        location / {
         add_header "Access-Control-Allow-Origin" "*"; 
         add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS";  
         charset utf-8;  
         try_files $uri $uri/ @rewrites;
        } 
        location ~ \.php$ {
         fastcgi_pass unix://var/run/php/php7.0-fpm.sock;
         fastcgi_index $index;
         fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
         include fastcgi_params;
         break;
        }
}


есть ajax
$.ajax({
                        url: ' http://u1.domain.loc/upload',
                        data: fd,
                        type: 'POST',
                        contentType: false,
                        processData: false, 
                        cache: false,
                        success: function (data) {
                        }

Почему ошибка
XMLHttpRequest cannot load u1.domain.loc/upload. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'domain.loc' is therefore not allowed access.
В чём может быть проблема ?
  • Вопрос задан
  • 962 просмотра
Пригласить эксперта
Ответы на вопрос 1
copist
@copist
Empower people to give
7838d6ffbf39455099b6c005805e8e9a.png

Посмотри реальные ответы сервера в Chrome Developer Tools в панели Network при отключенной опции "Disable Caching"

Там может не быть CORS заголовков, или они могут быть не с тем access-control-allow-origin, если ты уже открывал тот же URL через прямой запрос из строки браузера или запрашивал тот же URL в том же браузере с другого домена.

Дело в том, что браузер кэширует ответы включая заголовки. Ключом в кэше является URL запроса, а все заголовки (куки, origin, referrer) не участвуют. Поэтому у тебя в кэше может быть сохранённый ответ с заголовками ранее сделанного запроса.

Решение, которое гарантирует, что ответ сервера не будет кэшироваться:
1. в ответе сервера указывать заголовки, подавляющие кэширование
2. делать запросы методом POST, который не кэшируется
3. добавлять к URL "хвостик" из псевдослучайных символов, например ревизию кода, версию API, наименования вызывающего приложения или даже метку времени

На практике мы пытались 1, 2 и в итоге пришли к 3 если гарантированно нужен незакешированный ответ сервера. Например, количество непрочитанных сообщений пользователя.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы