Это еще один вопрос, касающийся механизма перенаправления / прокси_процесса 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;
}