@obvilion

При редиректе с HTTP на HTTPS возникает ошибка, в чем дело??

Добрый вечер.
Столкнулся с проблемой: надо сделать редирект с http на https, сделал следующим методом:
listen 80;
server_name *.universal-chat.net;
return 301 $server_name$request_uri;

Имеется домен universal-chat.net и api.universal-chat.net
Редирект с universal-chat.net на https://universal-chat.net проходит нормально.
А редирект api.universal-chat.net на https://api.universal-chat.net происходит с костылями.
Результат редиректа: api.universal-chat.net/api.universal-chat.net/api....
В чем может быть дело?
Весь конфиг:
user www-data;
worker_processes 4;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

worker_rlimit_nofile 150000;

events {
    worker_connections 8000;
    multi_accept on;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr — $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    gzip off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    reset_timedout_connection on;
    client_body_buffer_size 128k;

    server {
        listen 80;
        server_name 127.0.0.1;
        root /var/www/html;
        index index.html index.php;

        location ~* \.php$ {
            try_files $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_send_timeout 180s;
            fastcgi_read_timeout 180s;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    server {
        listen 80;
        server_name universal-chat.net *.universal-chat.net;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name universal-chat.net www.universal-chat.net;
        root /var/www/html/universal_chat;
        index index.html index.php;

        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_certificate "/etc/letsencrypt/live/universal-chat.net/cert.pem";
        ssl_certificate_key "/etc/letsencrypt/live/universal-chat.net/privkey.pem";

        location ~* \.php$ {
            try_files $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_send_timeout 180s;
            fastcgi_read_timeout 180s;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
        location /api/ {
            deny all;
        }
    }
    server {
        listen 443 ssl;
        server_name api.universal-chat.net;
        root /var/www/html/universal_chat/api;
        index index.php;

        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_certificate "/etc/letsencrypt/live/api.universal-chat.net/cert.pem";
        ssl_certificate_key "/etc/letsencrypt/live/api.universal-chat.net/privkey.pem";

        location ~* \.php$ {
            try_files $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_send_timeout 180s;
            fastcgi_read_timeout 180s;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
        location ~* ^(methods|includes) {
            deny all;
        }
    }
}
  • Вопрос задан
  • 356 просмотров
Решения вопроса 1
1. Кусок
server {
        listen 80;
        server_name universal-chat.net *.universal-chat.net;
        return 301 https://$host$request_uri;
}


Замените на 2 блока, так будет правильнее и тогда:

server {
        listen 80;
        server_name universal-chat.net www.universal-chat.net;
        return 301 https://universal-chat.net$request_uri;
}
server {
        listen 80;
        server_name api.universal-chat.net;
        return 301 https://api.universal-chat.net$request_uri;
}


Читаем статью для просвещения.

2. Рекомендую поменять еще некоторые дерективы:

worker_processes 4;
на
worker_processes auto;

Добавить
worker_cpu_affinity auto;
worker_shutdown_timeout 30;

30 замените на ваше желаемое число, см офф. документация

Добавить в секцию http директиву:
server_tokens off;

Если у Вас используется
sendfile on;
то разумно выставить
sendfile_max_chunk 128k;
Она ограничивает объём данных, который может передан за один вызов sendfile(). Нужно для исключения ситуации когда одно соединение может целиком захватить воркер.

По желанию добавить в секцию http:
keepalive_timeout 60s;
keepalive_requests 500;
client_body_timeout 30s;
client_max_body_size 256m;
send_timeout 30s;
types_hash_max_size 2048;
server_names_hash_max_size 8192;
server_names_hash_bucket_size 128;

Тестируем редиректы так:
curl -D - -o /dev/null -s http://universal-chat.net

и
curl -D - -o /dev/null -s http://api.universal-chat.net
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Lynn
@Lynn
nginx, js, css
Никогда не используйте $server_name. Вам нужен $host. Ну и протокол https в редиректе нужно указывать.
Ответ написан
VELIK505
@VELIK505
Руководитель департамента profitcentr.com
Попробуй поубирать все свои 301 редиректы и $scheme = "http" и пропиши просто:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
Ответ написан
Ваш ответ на вопрос

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

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