Использование http и https в Drupal

17.07.2013
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

Иногда складывается ситуация, когда при разработке сайтов возникает потребность в использовании обоих интернет-протоколов — HTTP и HTTPS - как в случаях требующих повышения уровня защиты сайта в целом, так и для большей защищенности отдельных его страниц. Использование HTTPS уместно, прежде всего, на страницах, содержащих личные данные пользователей, информацию для платежных систем и т.п. Данный протокол предлагает дополнительный слой шифрования/аутентификации между HTTP и TCP, хотя, собственно говоря, HTTPS это не отдельный протокол, а комбинация взаємодействия HTTP и SSL. То есть, SSL это протокол, обеспечивающий конфиденциальность обмена данными между клиентом и сервером, при том что он гарантует умеренную защиту от прослушивания и от нападения типа "человек-посередине" (man-in-the-middle).

Чтобы это реализовать, необходимо настроить веб-сервер и в предлагаемой статье рассматривается пример того, как это выполняется для веб-серверов Nginx и Apache, соответственно. После того как завершена стандартная процедура установки, нужно будет перейти к файлам конфигурации хостов, чтобы указать, где именно использовать протоколы HTTP та HTTPS (по умолчанию - это файлы в папке /etc/nginx/sites-availabe/ ). Кроме этого, понадобятся SSL ключ и сертификаты — их можно либо купить, либо самостоятельно сгенерировать.

Команды терминала для генерирования ключа и сертификата:

openssl genrsa -des3 -out example.key 1024
openssl req -new -key example.key -out example.crt

При генерировании ключа нужно указать в Common name домен, к которому будут задействованы ключи.

Пример конфигурации хоста “drupal7” со смешанным протоколом - HTTP + HTTPS в веб-сервере Nginx (путь к файлу будет, соответственно: /etc/nginx/sites-available/drupal7):

server {
    ## HTTP protocol port.
    listen *:80;
 
    ## HTTPS protocol port.
    listen *:443 ssl;
    
    server_name example.com www.example.com;
    
    ## Server certificate and key.
    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;
    
    root /var/www/example.com/htdocs;
    index index.html index.htm index.php index.cgi index.pl index.xhtml;
    
    error_log /var/log/nginx/drupal.error.log;
    access_log /var/log/nginx/drupal.access.log combined;
    
    server_tokens off;
    client_max_body_size 15M;
    
    # host_without_www
    if ($host ~* www\.(.*)) {
          set $host_without_www $1;
          rewrite ^(.*)$ http://$host_without_www$1 permanent;
    }



    ## Disable .htaccess and other hidden files
    location ~ /\. {
          deny all;
          access_log off;
          log_not_found off;
    }
 
    location = /favicon.ico {
          log_not_found off;
          access_log off;
    }
 
    location = /robots.txt {
          allow all;
          log_not_found off;
          access_log off;
    }
 
    location ~* ^(?:.+\.(?:htaccess|make|txt|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ {
          rewrite  ^/(.*)$  /index.php?q=$1  last;
    }


    ## Factcgi configuration
    location ~ \.php$ {
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_ignore_client_abort     off;
          fastcgi_connect_timeout 60;
          fastcgi_read_timeout 240;
          fastcgi_buffer_size 16M;
          fastcgi_buffers 4 32M;
          fastcgi_busy_buffers_size 64M;
          fastcgi_temp_file_write_size 64M;
    }

 
    ## Serve static files directly
    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico)$ {
          access_log off;
          expires max;
    }
 
    ## Imagecache needs to have php read any files that it's planning to manipulate
    location ^~ /files/imagecache/ {
          index index.php;
    }
 
    ## Assume a clean URL is requested, and rewrite to index.php
    if (!-e $request_filename) {
          rewrite ^/(.*)$ /index.php?q=$1 last;
          break;
    }
 
    location ^~ /files/ {
          allow all;
          log_not_found off;
          access_log off;
    }
 
    location ^~ /sites/default/files/ {
          allow all;
          log_not_found off;
          access_log off;
    }
   
}

Для веб-сервера Apache установки будут выглядеть так:

## Settigns for HTTP protocol

        ServerAdmin webmaster@localhost
        ServerName drupal

        ## Folder with drupal site
        DocumentRoot /var/www/drupal
        
              Options FollowSymLinks
              AllowOverride All
        

        ## Clean URLs for drupal site
        
              RewriteEngine On
              RewriteBase /
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteCond %{REQUEST_FILENAME} !-d
              RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              Allow from all
        

        ## File for error logging
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined



## Settigns for HTTPS protocol

        SSLEngine on
        ServerAdmin webmaster@localhost
        ServerName drupal

        ## Folder with drupal site
        DocumentRoot /var/www/drupal
        SSLCertificateFile /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key
        
              Options FollowSymLinks
              AllowOverride All
        

        ## Clean URLs for drupal site
        
              RewriteEngine On
              RewriteBase /
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteCond %{REQUEST_FILENAME} !-d
              RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
              Options Indexes FollowSymLinks MultiViews
              AllowOverride All
              Order allow,deny
              Allow from all
        

        ## File for error logging
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined

Не нужно забывать о своем хосте в файле конфигурации хостов: по умолчанию, он находится /etc/hosts. Теперь мы можем применить HTTPS протокол в самом друпале. Ниже приводится пример переадресации страницы /user/%uid/edit на "https://":

/**
 * Implements hook_boot().
 */ 
function example_boot() {
  global $base_root;
  if (isset($_POST)) {
  // If something has been posted to here then ignore the rules.
  return;
  }
  // Redirect all pages from https to http, ignore only user edit profile.
  // Function current_path is not available in hook_boot() so use $_GET['q'] instead.
  if (isset($_GET['q']) && !empty($_GET['q'])) {
    if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] != 443) {
      $args = explode('/', $_GET['q']);
      // if URL is user/uid/edit page
      if (!empty($args[0]) && $args[0] == 'user' && !empty($args[2]) && $args[2] == 'edit' && variable_get('action_http') == 1) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . '/' . $_GET['q']);
        cache_clear_all($base_root . request_uri(), 'cache_page');
        exit();
      }
    }
  }
  // Redirect user edit profile from http to https.
  if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) {
    $args = explode('/', $_GET['q']);
    if (!(!empty($args[0]) && $args[0] == 'user' && !empty($args[2]) && $args[2] == 'edit')) {
      header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . $_GET['q']);
      cache_clear_all($base_root . request_uri(), 'cache_page');
      exit();
    }
  }
}

Итак, было продемонстровано реализацию перехода на заданную страницу через защищённый протокол HTTPS. Это страница user/%uid/edit, а на всех других остаётся стандартный протокол HTTP. То есть, в проверке условий можна указать, на какой именно странице  переход на защищённый протокол должен осуществляться. 

Существуют готовые модули для работы с SSL в Drupal 6 та 7 - Secure Pages та Ubercart SSL. Первый предлагает возможность определения страниц, на которые переход будет осуществляться с помощью HTTPS, либо просто включает данный протокол для всегого сайта (наdrupal.org можно загрузить этот модуль, но стабильная версии пока нету). В Ubercart SSL, тоже, имеется такая функция, но в отличие от Secure Pages там не требуются патчи. 
Как видим, в данной статье рассматривалась настройка конфигурации для веб-серверов Apache и Nginx с поддержкой сразу двух протоколов - и HTTP, и HTTPS - сгенерированы сертификаты для обеспечения надежности HTTPS, и конечно же пример реализации этого в самом друпале.

1 vote, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

Иногда возникает потребность в реализации таких правил контроля доступа, которые не отвечают ни одному из критериев. К примеру, Вам нужно создать разрешения для...

2

Модуль rules позволяет нам выполнять нужные действия (actions) после выполнения определенных событий (​​events). В своем арсенале он...

3

Для начала - несколько слов о библиотеке.
pChart – это набор классов для...

4

Подключение к разным базам необходимо в случаях экспорта и импорта данных. Рассмотрим три способа как справиться с такой ситуацией.

5

Сейчас iPhone и iPad, далее iГаджеты, уже давно перестали быть чем-то новым и необычным. У разработчиков, в связи с этим, прибавилось задач, связанных с реализацией...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime