Access-Control-Allow-Origin проблема с префиксом www
У меня есть веб-сайт, бэкэнд nginx, python, django и frontend angularjs. У меня есть политики CORS на бэкэнде, чтобы разрешить только начало внешнего интерфейса, однако я получаю сообщение об ошибке при просмотре моего последнего разработанного раздела, используя www
в качестве префикса. Ошибка:
XMLHttpRequest не может загрузить http://backend.com/api/endpoint. Перенаправление с " http://backend.com/api/endpoint " на " http://backend.com/api/endpoint " было заблокировано политикой CORS: заголовок "Access-Control-Allow-Origin" имеет значение " http://frontend.com/ ", который не равен указанному источнику. Происхождение " http://www.frontend.com/ " поэтому не допускается
И то и другое www
и нет, URL-адрес веб-интерфейса включен в белый список CORS. Я предположил ошибку конфигурации nginx, но сайт хорошо работает во всех разделах, кроме последнего.
РЕДАКТИРОВАТЬ
Я использую коршедеры для добавления заголовка CORS к ответам. Конфигурация для этого довольно плохая, я просто адрес белого списка
CORS_ORIGIN_WHITELIST = (
'frontend.com',
'www.frontend.com',
'media.frontend.com',
'backend.com',
)
Вот конфигурация Nginx. Мы используем PhantomJS, чтобы вернуть ботам предоставленную версию сайта
########################################################################
# Frontend AngularJS Application
########################################################################
server {
listen 80;
root /home/frontend/current;
#listen 443 ssl;
server_name frontend.com;
#ssl_certificate /etc/nginx/ssl/frontend.com.crt;
#ssl_certificate_key /etc/nginx/ssl/frontend.com.key;
access_log /var/log/nginx/www.frontend.com/access.log;
error_log /var/log/nginx/www.frontend.com/error.log;
keepalive_timeout 5;
charset utf-8;
location ~ ^/(scripts.*js|styles|images) {
gzip_static on;
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
location / {
include /etc/nginx/mime.types;
try_files $uri @phantomjs;
}
location @phantomjs {
# We set control variable to 2 to be used in rewrite if a bot visits the page
set $i 0;
# If any of the user agent in the RegEX, we set the control variable to 1...
if ($http_user_agent ~* "Facebot|dapulse|slack|facebook|linkedin|googlebot|yahoo|bingbot|baiduspider|yandex|yeti|yodaobot|gigabot|ia_archiver|facebookexternalhit|twitterbot|developers\.google\.com") {
set $i 1;
}
# ...or if Googlebot in particular (or we appended phantomjs=1 query string for debug)
# we set the control variable to 1 as well
if ($args ~ "_escaped_fragment_|phantomjs=1") {
set $i 1;
}
# Then, finally, if control variable is true (set to 1) we pass the $uri to phantomjs proxy
# $uri will be something like /some/path/to/something WITHOUT any query string argument
if ($i = 1) {
# rewrite .* /$scheme://$host$request_uri? break;
rewrite .* /$uri? break;
proxy_pass http://localhost:9999;
}
if ($i = 0) {
rewrite .* /index.html?$query_string break;
}
}
}
########################################################################
# Media Assets
########################################################################
server {
listen 80;
#listen 443 ssl;
server_name media.frontend.com;
#ssl_certificate /etc/nginx/ssl/media.frontend.com.crt;
#ssl_certificate_key /etc/nginx/ssl/media.frontend.com.key;
access_log /var/log/nginx/media.frontend.com/access.log;
error_log /var/log/nginx/media.frontend.com/error.log;
root /home/frontend/media;
keepalive_timeout 5;
charset utf-8;
location ~ ^/(scripts.*js|styles|images) {
gzip_static on;
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
########################################################################
# API & Backend Django Application
########################################################################
server {
listen 80;
server_name backend.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
#proxy_pass http://media.frontend.com:80/;
#root /home/frontend/media;
alias /home/frontend/media/;
}
location /media/ {
#proxy_pass http://media.frontend.com:80/;
#root /home/frontend/media;
alias /home/frontend/media/media/;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/backend/wsgi.sock;
}
}