Очень приятная статистика по браузерам посетителей
Сегодня заглянул в статистику одного сайта и посмотрел данные по браузерам посетителей. Очень приятная картина — Internet Explorer отсутствует почти полностью, он на второй странице с общим для всех версий результатом 16 посетителей.

Что не радует — 4 из обладателей IE пользуются версией 6.0. Анафема!
Скрываем ссылку за редиректом — Drupal 7
Речь исключительно про Link field, для ссылок из контента существует модуль gotwo. Предпосылки могут быть разные, но задача скрыть ссылку — не такая редка вещь.
Дано: Drupal 7.8, тип содержимого с единственной ссылкой (link field).
Задача: сделать так, чтобы ссылка отображалась в виде /node/*nid*/goto, а при нажатии перекидывала посетителя на адрес, фактически содержащийся в ссылке (link url).
Потребуются: модули redirect, custom formatters, rules.
Custom Formatters можно заменить на шаблон поля. Для примера field–field-url.tpl.php
<?php foreach ($items as $delta => $item) : ?>
<a rel="nofollow"
title="<?php print $element['#object']->field_url['und'][0]['title']; ?>"
href="/node/<?php print $element['#object']->nid;?>/goto">LINK TEXT</a>
<?php endforeach; ?>
Текст ссылки можно заменить на любое значение из $element['#object'], это все данные по текущему документу (node).
Custom formatter слегка удобнее использовать и оперативно редактировать. У меня получился такой код для link_field:
// Custom formatter for a link_field.
$node = $variables['#object'];
foreach (element_children($variables['#items']) as $delta) {
$item = $variables['#items'][$delta];
$source = "Перейти по ссылке";
$destination = 'node/'.$node->nid.'/goto';
return l($source, $destination, array('html' => false, 'attributes'=>array('rel'=>'nofollow', 'title'=>'Перейти в по ссылке '.$node->title, 'class'=>array('my-link-field'))));
}
Затем для нужного view mode меняем вывод нужной ссылки (Структура — Типы материалов — ВашТип — Управление отображением). Все, ссылку заготовили, но она пока ведет в никуда. Точнее, на ту же страницу, что и /node/*nid*, как любая ссылка на /node/*nid*/whatever.
Правило (Rule) настраиваем на событие “После редактирования существующего документа” и “После сохранения нового документа”, чтобы не пропустить возможные изменения ссылки. Отфильтровываем условиями тип материала, если необходимо. Действие будет типа PHP code (модуль PHP нужно заранее включить). Код примерно такой, взят почти полностью из тестов, идущих с модулем Redirect.
$redirect_defaults = array(
'uid' => $node->uid,
'status_code' => 302,
);
$redirect_path = $node->field_url['und'][0]['url']; // real URL to redirect to
$source_path = 'node/'.$node->nid.'/goto'; // fake url (tweak to your link field custom formatter)
redirect_delete_by_path($source_path); // delete existing redirects to avoid PDO errors
$source_parsed = redirect_parse_url($source_path);
$redirect['source'] = $source_parsed['url'];
if (isset($source_parsed['query'])) {
$redirect['source_options']['query'] = $source_parsed['query'];
}
$redirect_parsed = redirect_parse_url($redirect_path);
$redirect['redirect'] = $redirect_parsed['url'];
if (isset($redirect_parsed['query'])) {
$redirect['redirect_options']['query'] = $redirect_parsed['query'];
}
if (isset($redirect_parsed['fragment'])) {
$redirect['redirect_options']['fragment'] = $redirect_parsed['fragment'];
}
$redirect = (object) $redirect;
redirect_object_prepare($redirect, $redirect_defaults);
redirect_save($redirect);
Теперь после создания или изменения документа будет выполняться правило, которое создает перенаправление с локального адреса /node/NNN/goto на адрес, указанный в поле field_url документа с идентификатором NNN.
Если контент уже был, то нужно «передернуть» все материалы нужного типа — сфабриковать событие, по которому сработает правило. Я для этого использовал views bulk operations (VBO).
Вероятно, не самый простой и изящный способ, но вполне прозрачный и рабочий, по-моему.
Памятка: Plesk, Nginx, Apache
Надо собрать все вместе, а то на память надежды нет. Собрано в кучу из нескольких источников.
Дано: CentOS 5 (64bit), Plesk 10.3, Apache 2.
Нужный результат: Nginx отсылает статику, Apache все остальное (php в основном).
1. Установка nginx на CentOS 5 (без фанатизма).
# rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
# yum install nginx
# chkconfig –level 35 nginx on
Меняем порт Apache по инструкции Parallels (Plesk 10.2, на 10.3 сработало)
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` -D psa -e'replace into misc (param, val) values ("http_port", 8080)'
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` -D psa -e'replace into misc (param, val) values ("https_port", 8080)'
Здесь 8080 — новый порт. Аналогичный указываем в /etc/httpd/conf/httpd.conf (Listen 80 → Listen 8080).
Ахтунг! В документации Plesk 10 есть тема про правку шаблона /usr/local/psa/admin/conf/templates/default/domain/domainVirtualHost.php и замену $VAR->server->webserver->httpPort на нужный порт — делать это не надо и очень вредно, Apache ругается: VirtualHost x.x.x.x:8080 overlaps with VirtualHost x.x.x.x:8080, the first has precedence, perhaps you need a NameVirtualHost directive).
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` -D psa -e'replace into misc (param, val) values ("http_port", 8080)'
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` -D psa -e'replace into misc (param, val) values ("https_port", 8080)'
# /usr/local/psa/admin/bin/httpdmng --reconfigure-all
У более ранних версий Plesk (до 9.5) была отдельная команда на этот случай (websrvmng –set-http-port –port=8080).
Дальше берем в этом малость устаревшем руководстве нужные файлы (тыц) и распаковываем куда-нибудь в рабочую папку. Копируем nginx.conf → /etc/nginx/nginx.conf и proxy.conf → /etc/nginx/proxy.conf — они подхачены для использования с Plesk.
UPDATE: По ссылке выше файлы не актуальны для Plesk 10 — там жестко зашито расположение корневых папок (document root) для доменов и поддоменов. В новом Плеске их можно произвольно переносить или переименовывать через панель управления, а сами данные хранятся в базе. Здесь исправленная версия generate_nginx_conf.sh для Plesk 10 и сопутствующие шаблоны, в которых тоже есть изменения. Не проверял и пока не менял ничего в настройке списков рассылки, webmail и sitebuilder.
Запускаем sh generate_nginx_conf.sh — скрипт выбирает из базы все домены и поддомены и создает в каждой папке /var/www/vhosts/*/conf/nginx.conf. Если порт для Апача выбран не 8080, то предварительно нужно поправить шаблоны template_dom.conf, template_subdom.conf (там порт жестко зашит).
Порт, на котором работает Apache (8080 или другой) нужно открыть в iptables. Делать это пришлось через панель управления, команда (iptables -A INPUT -p tcp –dport 8080 -j ACCEPT) не лечит.
Готово, вроде, перезапускаем httpd и nginx.
Проблемы по ходу дела — не запускался nginx, пришлось увеличивать server_names_hash_max_size 1024 (было 512) и server_names_hash_bucket_size 128 (было 64). Это /etc/nginx/nginx.conf.
TODO: После добавления домена в Plesk нужно создать конфиг для nginx. Скрипт generate_nginx_conf.sh каждый раз перезаписывает настройки виртуального хоста (/var/www/vhosts/*/nginx.conf) из шаблонов заново (нужно оставлять измененные).
UPDATE: Повесил скрипт создания/обновления nginx.conf на события в Plesk: Website created/updated/deleted (аналогично для Subdomain и Domain alias). Теперь конфигурация для nginx создается/обновляется автоматически.
Осталось одно желание — иметь возможность настраивать конфигурацию для каждого сайта отдельно. Сейчас все конфиги переписываются из шаблона и похожи как однояйцевые близнецы. Можно встроить проверку существования файла и не трогать его (только создавать новые), но это плохой выход, поскольку все поддомены/синонимы настраиваются в одном файле — после добавления алиаса или поддомена надо будет руками править nginx.conf.
Делать подключение еще одного файла на каждый домен/поддомен тоже бессмысленно — nginx не принимает переопределение, то есть 2 одинаковых директивы (location /, например) в «главном» и «подключаемом» конфигах сделать не получится, а без этого затея теряет смысл. Надо какой-то ум применить, пока не придумал ничего.
Реверансы
http://wiki.mediatemple.net/w/%28dv%29:Configure_nginx_as_reverse_proxy_web_server
http://www.grafxsoftware.com/faq.php/HOW-TO-configure-PLESK-with-NGinx-proxy-reverse/1/1/
http://kb.parallels.com/11232
http://www.x83.net/plesk-10-nginx-reverse-proxy-configuration-in-front-of-apache/