Статьи и доки
Меню сайта





Категории каталога
manpages [3]
Описания некоторых манов
APACHE [0]
Заметки по Apache
Scripting [5]
Что есть по скриптам
DNS [0]
bind etc.
EXIM [2]
Почтовый веб-сервер. Несколько примеров
SQUID [0]
Прокси-сервер
Общее [4]
Общее


Форма входа


Поиск


Друзья сайта



Приветствую Вас, Гость · RSS 20.10.2017, 10:01
Главная » Статьи » FreeBSD » Общее

Nginx редирект на HTTPS с некоторыми исключениями

В основу статьи легла задача, которая стояла передо мной некоторое время и я изучал лучший вариант её решения. Большая часть материала взята из статьи: 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), тут всё очень элегантно smile :



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;

}


...



(код указан не весь, тут ещё много чего, но основное выделено синим)



 



Это рабочая конфигурация, которая реально работает. Битрик требует к себе особого отношения и сам может редиректить, поэтому если что-то не выходит, спрашивайте здесь, или на тостере.



Всем удачи!



 

Категория: Общее | Добавил: rm-rf (05.05.2017)
Просмотров: 67 | Рейтинг: 5.0/1 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Сайт управляется системой uCoz