Установка Seo Shield 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(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(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 не должен срабатывать. Например, страницы админ-панели сайта либо POST-запросы.
Предположим, что у Вас URL админ-панели такой: http://example.com/admin/...
В таком случае исключение будет иметь вид:
if(isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], '/admin') === false && $_SERVER['REQUEST_METHOD'] === 'GET')
{
    if(file_exists('current/seoshield-client/main.php'))
    {
        ...подключение SeoShield Client...
    }
}

Проверка на НЕ ajax-запрос:
if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) || (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'))
{
     ...
}


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

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

 

WordPress

Советуем вносить код подключения в файл wp-config.php

 

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(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(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}-->

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