Назад | Перейти на главную страницу

Исходная папка Nginx из внешнего домена без перенаправления

Это еще один вопрос, касающийся механизма перенаправления / прокси_процесса Nginx.

Моя проблема в следующем: у меня есть сайт domain.tld и второй blog.domain.tld. И я хочу получить содержимое domain.tld/blog с содержанием blog.domain.tld. Он должен быть невидимым для пользователя. Итак, я полагаю, что способ сделать это - использовать что-то около proxy_pass директива.

Я попробовал это без удачи: server { listen 443 ssl; [...] location ~ /blog { #rewrite ^/blog(.*) https://blog.domain.tld$1 permanent; proxy_pass https://blog.domain.tld; proxy_set_header Host blog.domain.tld; } location / { proxy_pass http://localhost:8004; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }

Но у меня 404 дюйма domain.tld журналы: $ curl -I https://domain.tld/blog HTTP/1.1 404 Not Found

Я предполагаю: запрос отправлен https//blog.domain.tld/blog тогда как он должен быть отправлен https://blog.domain.tld/. Итак, я ищу способ переписать этот запрос в хорошей форме.

Есть идеи?

ОБНОВИТЬ: полный файл конфигурации, заданный в комментарии:

server { 
    listen 80;
    server_name zenergie.engie.happy-dev.fr energiefutee.fr;

    root /opt/zenergie/;

    location /.well-known/ {
            try_files $uri =404;
    }

    location / {
            return 301 https://$host$request_uri;
    }
}       

server {
    listen 443 ssl; 

    server_name zenergie.engie.happy-dev.fr energiefutee.fr;
    charset utf-8;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    # disable SSL protocols ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;   # remove deprecated ciphers 
    ssl_prefer_server_ciphers On;
    ssl_certificate /etc/letsencrypt/live/zenergie.engie.happy-dev.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/zenergie.engie.happy-dev.fr/privkey.pem;
    ssl_session_cache shared:SSL:128m;  
    #add_header Strict-Transport-Security "max-age=31557600; includeSubDomains";     # tell the browser to force HTTPS for one year
    ssl_stapling on;        # activate OCSP
    ssl_stapling_verify on;

    access_log /opt/zenergie/logs/access.log;
    error_log /opt/zenergie/logs/error.log;

    root /opt/zenergie/;

    location ~ /blog {
            #rewrite ^/blog(.*) https://zenenergie-blog.staging.happy-dev.fr$1 permanent;
            proxy_pass https://zenenergie-blog.staging.happy-dev.fr;
            proxy_set_header Host zenenergie-blog.staging.happy-dev.fr;
    }

    location ~ /static/ {
            add_header X-Static hit;
    }

    location ~ /media/ {
            add_header X-Static hit;
    }

    location / {
            proxy_pass http://localhost:8004;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;      
    }

}

Местоположение вашего блога должно быть перезаписано, чтобы удалить / blog из входящего URL-адреса, как в приведенном ниже коде.

    rewrite ^/blog(.*) /$1 break;

Однако обычно вы хотите перенаправить / blog на / blog /, потому что в противном случае любые относительные URL-адреса в вашем блоге будут указывать на неправильное местоположение. Например, допустим, html, возвращенный с URL-адреса https: //blog.domain.tld/ ссылается на URL-адрес image.png. Браузер интерпретирует полный URL как https: //blog.domain.tld/image.png. Если вы не перенаправляете на / blog /, то обслуживайте контент на https: //domain.tld/blog в конечном итоге браузер интерпретирует эту относительную ссылку как http: //domain.tld/image.png вместо того https: //domain.tld/blog/image.png. Короче говоря, у вас будет битый образ.

Так что вот и версия с редиректом.

    location ~ /blog {
            rewrite ^/blog$ /blog/ redirect;
            rewrite ^/blog(/.*) /$1 break;
            proxy_pass https://blog.domain.tld;
            proxy_set_header Host blog.domain.tld;
    }