Використання http та https у Drupal

17.07.2013
http and https usage in Drupal
Автор:

Час від часу при розробці сайтів виникають ситуації коли потрібно використовувати обидва інтернет-протоколи HTTP та HTTPS - з метою підвищення рівня захисту всього сайту або певних його сторінок. Використовувати HTTPS є доречним перш за все на сторінках, що містять приватні дані користувачів, інформацію про платіжні системи, тощо. Цей протокол надає додатковий шар шифрування/автентифікації між HTTP i TCP. Власне кажучи, HTTPS це не окремий протокол, а комбінація взаємодії HTTP з SSL.

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

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

openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr 

Приклад конфігурації хоста “drupal7” зі змішаним протоколом - HTTP + HTTPІ в веб-сервері 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
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName drupal

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

        ## Clean URLs for drupal site
        <Directory /var/www/drupal/>
              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
        </Directory>

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

</VirtualHost>

## Settigns for HTTPS protocol
<VirtualHost *:443>
        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
        <Directory />
              Options FollowSymLinks
              AllowOverride All
        </Directory>

        ## Clean URLs for drupal site
        <Directory /var/www/drupal/>
              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
        </Directory>

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

</VirtualHost>

Потрібно, також, не забути записати свій хост в файлі конфігурації хостів: по замовчуванню він знаходиться в /etc/hosts. Тепер HTTPS протокол доступний в самому Drupal. Нижче наводиться приклад переадресації сторінки /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. Тобто, в перевірці умови можна зазначити, на якій саме сторінці має здійснюватись перехід на захищений протокол.

Існують contrib-модулі для роботи з SSL в Drupal 6 та 7 - Secure Pages та Ubercart SSL. Перший надає можливість визначати сторінки, на які перехід буде здійснюватись за допомогою HTTPS, або просто ввімкнути цей протокол для всього сайту (на drupal.org можна завантажити модуль, але поки що немає стабільної версії). Ubercart SSL також має таку функцію, але на відміну від Secure Pages, він не вимагає ніяких патчів. 

У данній статті було розглянуто налаштування конфігурації для веб-серверів Apache та Nginx з підтримкою відразу двох протоколів - HTTP та HTTPS, згенеровано сертифікати для забезпечення надійності HTTPS, а також було показано приклад реалізації цього у самому Drupal.

Голосів: 1 Рейтинг: 5

Також по темі

1

Сьогодні iPhone та iPad - далі iГаджети - перестали бути для нас у дивовижу, і все частіше розробники наштовхуються на проблему реалізації функціоналу під ці пристрої.

2

Ні для кого не секрет, що Google Analytics (далі — GA) — наймогутніший інструмент для збору даних...

3

Queue API - спеціальний функціонал в Drupal, який дозволяє формувати чергу і контролювати виконання трудомістких операцій на сайті. На відміну від Batch API, Queue API...

4

Інколи виникає необхідність реалізувати правила контролю доступу, які не відповідають жодним критеріям. Наприклад Ви хочете створити дозволи для окремих нод одного типу матеріалу, або потрібно...

Subscribe to our blog updates