В основу статьи легла задача, которая стояла передо мной некоторое время и я изучал лучший вариант её решения. Большая часть материала взята из статьи: http://redant.com.au/ruby-on-rails-devops/manage-ssl-redirection-in-nginx-using-maps-and-save-the-universe/ (Thank you so much, if you read this post). У меня стояла задача сделать так, чтобы сайт всегда работал по HTTPS, но некоторые локейшены должны быть доступны по HTTP. Таким образом принудительно делать классический вариант с RETURN не получится. Придётся использовать IF, хотя это зло. Итак у меня есть четыре локейшена: www.website.com/form1 www.website.com/form2 www.website.com/form3 www.website.com/form4 Они должны быть доступны по http. Остальной сайт и все остальные локейшены должны быть доступны ТОЛЬКО по HTTPS. А если открываются по HTTP, то принудительно редиректятся на HTTPS. Делаю MAP (ставим перед блоком SERVER), тут всё очень элегантно :
map $uri $preferred_proto { default "https"; ~^/(form1|form2|form3|form4) "http"; }
Далее делаем два блока SERVER. Первый работает на 80 порту, второй работает на 443. И только! В обоих серверах нужно указать LOG файлы и ROOT директории. Также я включил локейшены со сраным битриксом и PHP: Вот первый блок сервер:
server { listen 80; listen [::]:80; server_name website.com www.website.com; root /var/www/html; access_log /var/log/nginx/website_com.log; error_log /var/log/nginx/websitec_com_error.log; if ($preferred_proto = "https") { return 301 https://www.website.com$request_uri; } location / { try_files $uri $uri/ @bitrix; if (!-e $request_filename){ rewrite ^(.*)$ /bitrix/urlrewrite.php; } } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-website.sock; fastcgi_index index.php; include fastcgi_params; } location @bitrix { fastcgi_pass unix:/var/run/php5-website.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php; fastcgi_read_timeout 300; } }
Вот второй блок сервер:
server { listen 443 ssl default_server; charset utf-8; server_name www.website.com; keepalive_timeout 70; ssl_certificate /etc/nginx/certificates/website_com.csr; ssl_certificate_key /etc/nginx/certificates/website_com.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; root /var/www/html; access_log /var/log/nginx/website_com.log; error_log /var/log/nginx/websitec_com_error.log; index index.php index.html; autoindex off; error_page 404 /404.php; rewrite_log on; fastcgi_read_timeout 300; fastcgi_send_timeout 300; fastcgi_buffers 64 4K; if ($preferred_proto = "http") { return 301 http://www.website.com$request_uri; } ... (код указан не весь, тут ещё много чего, но основное выделено синим)
Это рабочая конфигурация, которая реально работает. Битрик требует к себе особого отношения и сам может редиректить, поэтому если что-то не выходит, спрашивайте здесь, или на тостере. Всем удачи!
|