Apache CORS заголовки для докера - PullRequest
0 голосов
/ 05 ноября 2018

На моем сервере у меня есть два док-контейнера. Одним из них является Docker Registry, а другим - приложение Angular, которое обращается к конечной точке первого контейнера.

Реестр Docker имеет сопоставленный порт 5000 и через виртуальный хост Apache передается на домен docker.mydomain.com. Приложение Angular имеет порт 5002 и проксируется на dockerhub.mydomain.com

Я настроил файл виртуального хоста для своего реестра Docker следующим образом:

<VirtualHost *:80>
        ServerName docker.mydomain.com
        Redirect permanent / https://docker.mydomain.com/
</VirtualHost>

<VirtualHost *:443>

        ServerName mydomain.com
        ServerAlias docker.mydomain.com
        ServerAdmin admin@mydomain.com

        # Headers required for docker registry to work
        Header set Host "docker.mydomain.com"
        Header always set "Docker-Distribution-Api-Version" "registry/2.0"
        Header onsuccess set "Docker-Distribution-Api-Version" "registry/2.0"
        RequestHeader set X-forwarded-Proto "https"

        # Settings CORS headers
        Header always set Access-Control-Allow-Origin "*"
        Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept"
        Header always set Vary "Origin, Access-Control-Request-Headers, Access-Control-Request-Method"

        # SSL settings
        SSLEngine On
        SSLCertificateFile "/etc/letsencrypt/live/docker.mydomain.com/cert.pem"
        SSLCertificateKeyFile "/etc/letsencrypt/live/docker.mydomain.com/privkey.pem"
        SSLCertificateChainFile "/etc/letsencrypt/live/docker.mydomain.com/chain.pem"

        # Reply to all OPTIONS requests with 200
        RewriteEngine On
        RewriteCond %{REQUEST_METHOD} OPTIONS
        RewriteRule ^(.*)$ $1 [R=200,L]

        ProxyPreserveHost On
        ProxyRequests Off

        # Proxy request to localhost:5000 and check authentication
        <Location "/">
                ProxyPass http://localhost:5000/
                ProxyPassReverse http://localhost:5000/
                Order deny,allow
                Allow from all
                AuthName "Registry Authentication"
                AuthType basic
                AuthUserFile "/opt/docker-registry-htpasswd/.registry-htpasswd"
                # Allow reading to all users, but pushing images only for certain user
                <Limit GET HEAD>
                        Require valid-user
                </Limit>
                <Limit POST PUT DELETE PATCH>
                        Require user myuser
                </Limit>
        </Location>

        ErrorLog ${APACHE_LOG_DIR}/docker-registry-error.log
        LogLevel warn

</VirtualHost>

Моему приложению Angular, которое находится в другом докере, предоставляется изображение nginx со следующей конфигурацией:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen 4200;
        server_name  localhost;

        root   /usr/share/nginx/html;
        index  index.html index.htm;
        include /etc/nginx/mime.types;

        gzip on;
        gzip_min_length 1000;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
            try_files $uri $uri/ /index.html;
        }
    }
}

Теперь, когда я открываю свое приложение Angular на dockerhub.mydomain.com и оно пытается вызвать API с docker.mydomain.com, я получаю сообщение об ошибке, связанное с заголовками CORS:

Access to XMLHttpRequest at 'https://docker.mydomain.com/v2' from 
origin 'https://dockerhub.mydomain.com' has been blocked by CORS policy: 
The 'Access-Control-Allow-Origin' header has a value 'http://localhost:4200' that is 
not equal to the supplied origin.

Насколько я знаю, если для заголовка Allow-Origin установлено значение *, это означает, что для него задано значение Origin, равное https://dockerhub.mydomain.com, а для Allow-Origin установлено значение localhost: 4200 - В чем здесь может быть проблема?

Кроме того, приложение Angular всегда отправляет запросы на docker.mydomain.com, а не на локальный адрес.

1 Ответ

0 голосов
/ 11 ноября 2018

Вместо копирования nginx.conf в /etc/nginx/nginx.conf Я скопировал файл конфигурации в /etc/nginx/conf.d/default.conf

Затем я немного сократил файл conf:

server {
    listen 80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Теперь я правильно установил заголовки CORS во всех браузерах

...