Установка Seo Shield Client

Папку которую скачали переименовываем с seoshield-client-master на seoshield-client
В кореневую директорию сайта (расположение главного index.php) заливаем папку seoshield-client
  1. Перейдя по URL http://<domain_name>/seoshield-client/ должны увидеть белую страницу и 200ый статус HTTP ответа (в случае если этого не произошло, возможно в .htaccess сайта необходимо добавить исключение для адреса /seoshield-client/).
  2. Далее необходимо подключить SeoShield Client к сайту. Для этого выполните следующие действия в главном исполняемом php-файле, обычно - index.php
    • Подключить файл seoshield-client/main.php
    • Вызвать функцию seo_shield_start_cms
    • Пропустить сформированный HTML-код через функцию seo_shield_out_buffer с помощью функции ob_start или напрямую передав его в функцию

Примеры подключения:

if(isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/admin') === false && $_SERVER['REQUEST_METHOD'] === 'GET'){
    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')){
        if(file_exists('seoshield-client/main.php'))
        {
            include_once('seoshield-client/main.php');
            if(function_exists('seo_shield_start_cms')){
                seo_shield_start_cms();
            }
            if(function_exists('seo_shield_out_buffer')){
                ob_start('seo_shield_out_buffer');
            }
        }
    }
}


$html = ...
if(isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/admin') === false && $_SERVER['REQUEST_METHOD'] === 'GET'){
    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')){
        if(file_exists('seoshield-client/main.php'))
        {
            include_once('seoshield-client/main.php');
            if(function_exists('seo_shield_start_cms')){
                seo_shield_start_cms();
            }
            if(function_exists('seo_shield_out_buffer')){
                $html = seo_shield_out_buffer($html);
            }
        }
    }
}
echo $html;


В примеры добавлены исключения для тех страниц, на которых SeoShield Client не должен работать. Среди таких: страницы админ-панели (в примере использован адрес /admin, если на Вашем сайте URL админ-панели отличается - необходимо внести соответствующие изменения в проверки), POST/ajax-запросы.
В случае, если сервер не определяет тип запроса (GET/POST), либо не передает заголовки HTTP_X_REQUESTED_WITH, соответствующие проверки нужно убрать.


Фреймворки Yii, ZF2

Вызов кода нужно делать до строчек Zend\Mvc\Application::init($config)->run(); либо (new yii\web\Application($config))->run();

  

OpenCart и схожие CMS

В некоторых CMS вывод контента осуществляется методами самой CMS. Например вы можете увидеть в index.php следующее $response->output();
В таком случае:

Вариат №1. Получить контент такми образом:
ob_start();
$response->output();
$html = ob_get_contents();

И далее "пропустить" его через модифицирующую функцию SeoShield Client:
$html = seo_shield_out_buffer($html);

В результате подключение будет выглядеть следующим образом:
ob_start();
$response->output();
$html = ob_get_contents();
if(isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/admin') === false && $_SERVER['REQUEST_METHOD'] === 'GET'){
    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')){
        if(file_exists('seoshield-client/main.php'))
        {
            include_once('seoshield-client/main.php');
            if(function_exists('seo_shield_start_cms'))
                seo_shield_start_cms();
            if(function_exists('seo_shield_out_buffer'))
                $html = seo_shield_out_buffer($html);
        }
    }
}
echo $html;

Внимание! Этот вариант не сработает, если на сайте включен метод который сжимает контент перед тем как отдать его браузеру.

Вариант №2. Найти в исходниках класс Response, стандартный путь к нему: system/library/response.php. В этом файле должен быть метод output с примерно таким содержимым:
if ($this->output) {
    if ($this->level) {
        $output = $this->compress($this->output, $this->level);
    } else {
        $output = $this->output;
    }    
        
    if (!headers_sent()) {
        foreach ($this->headers as $header) {
            header($header, true);
        }
    }
    
    echo $output;
}
Тогда этот метод можно переписать следующим образом:
if ($this->output) {
    if(isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/admin') === false && $_SERVER['REQUEST_METHOD'] === 'GET'){
        if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')){
            if(file_exists('seoshield-client/main.php'))
            {
                include_once('seoshield-client/main.php');
                if(function_exists('seo_shield_start_cms'))
                    seo_shield_start_cms();
                if(function_exists('seo_shield_out_buffer'))
                    $this->output = seo_shield_out_buffer($this->output);
            }
        }
    }


    if ($this->level) {
        $output = $this->compress($this->output, $this->level);
    } else {
        $output = $this->output;
    }    
        
    if (!headers_sent()) {
        foreach ($this->headers as $header) {
            header($header, true);
        }
    }
    
    echo $output;
}

 

Django v.2 (python)

  1. На сервере должен быть установлен PHP (минимум 5.6, с поддержкой mbstring)
  2. В корневую директорию приложения заливаем папку /site/polls/seoshield-client
  3. Создаем файл /site/polls/seoshield-client/django_seoshield.php

    <?php
    if(isset($argv[1]) && isset($argv[2]) && isset($argv[3]))
    {
      $_SERVER['HTTP_HOST'] = $argv[1];
      $_SERVER['REQUEST_URI'] = $argv[2];

      $html = $argv[3];

      if(file_exists(__DIR__.'/main.php')) {
        include_once(__DIR__.'/main.php');
        if(function_exists('seo_shield_start_cms')){
          seo_shield_start_cms();
        }
        if(function_exists('seo_shield_out_buffer')){
          $html = seo_shield_out_buffer($html);
        }
      }

      echo $html;
    }


  4. Создаем файл /site/polls/middleware.py

    from django.utils.deprecation import MiddlewareMixin
    from django.conf import settings
    import subprocess
    import os


    class SeoShieldMiddleware(MiddlewareMixin):
      def process_response(self, request, response):

      # исключение для админ-панели
      if request.path.find('/admin') != -1:
        return response

      # искюлючение для ajax-запросов
      if request.is_ajax():
        return response

      if request.method == 'GET':
        script_path = os.path.join(settings.BASE_DIR, 'polls', 'seoshield-client')
        content = getattr(response, 'content', '')
        try:
          if '127.0.0.1' not in request.get_host():
            content = subprocess.check_output(['php', script_path + '/django_seoshield.php', request.get_host(), request.path, content])
        except OSError as e:
          logger.error('Error related with seoshield. Exception: ' + str(e))

      if content:
        response.content = content
        return response

      else:
        return response

  5. Подключаем созданый middleware в настройках приложения /site/settings.py

    MIDDLEWARE = [
      ...
      'polls.middleware.SeoShieldMiddleware',
    ]

  6. Настроим сервер Nginx

    location ^~ /seoshield-client/ {
      alias /site/polls/seoshield-client;
      index index.php;
      rewrite .* /index.php last;
    }

    location ~* \.php(/|$) {
      root /site/polls/seoshield-client;
      try_files $uri = 404;
      fastcgi_split_path_info ^(.+\.php)(/.*)$;
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }


При правильном подключении, перед закрывающим тегом body должен появится проверочный комментарий:
<!--{seo_shield_out_buffer}-->

Подписаться Подписаться Подписаться