Установка Seo Shield Client
В кореневую директорию сайта (расположение главного
index.php
) заливаем папку seoshield-client
- Перейдя по URL
http://<domain_name>/seoshield-client/
должны увидеть белую страницу и 200ый статус HTTP ответа (в случае если этого не произошло, возможно в.htaccess
сайта необходимо добавить исключение для адреса/seoshield-client/
). - Далее необходимо подключить 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
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)
- На сервере должен быть установлен PHP (минимум 5.6, с поддержкой mbstring)
- В корневую директорию приложения заливаем папку /site/polls/seoshield-client
- Создаем файл /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;
}
- Создаем файл /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
- Подключаем созданый middleware в настройках приложения /site/settings.py
MIDDLEWARE = [
...
'polls.middleware.SeoShieldMiddleware',
]
- Настроим сервер 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}-->