Статьи

Недавно возникла необходимость выполнить переадресацию URL с параметрами /index.html?page=cat&id=1 на /store/products/cat1.html Я создал такие правила mod_rewrite, чтобы сделать это:

RewriteCond %{REQUEST_URI} ^/index\.html
RewriteCond %{QUERY_STRING} page=cat&id=1
RewriteRule ^(.*)$ http://%{HTTP_HOST}/store/products/cat1.html [L,QSA,R=301]

В данном примере мы проверяем, что страница, на которую пытался перейти пользователь index.html Параметры запроса в QUERY_STRING содержат искомые значения page=cat&id=1 Производим переадресацию на /store/products/cat1.html

Расшифровка RewriteRule параметов

  • L - правило последнее т.е. после него не обрабатывать остальные правила mod_rewrite
  • QSA - означает добавить оригинальное значение QUERY_STRING на страницу /store/products/cat1.html
  • R=301 - означает Permanent redirect - URL перемещен на постоянной основе

Если нужно получить поле с редактором в плагине Wordpress CMS можно воспользоваться таким кодом, который позволит добавить произовольне поле в формы добавления и редактирования категорий постов:


add_action('admin_init', 'ts_init');
function ts_init() {
	$ts_taxonomies = get_taxonomies();
	if (is_array($ts_taxonomies)) {	
	    foreach ($ts_taxonomies as $ts_taxonomy) {
	        add_action($ts_taxonomy.'_add_form_fields', 'ts_add_texonomy_field');
		add_action($ts_taxonomy.'_edit_form_fields', 'ts_edit_texonomy_field');
	    }
	}
}

add_filter('admin_head','ts_show_tiny_MCE');
function ts_show_tiny_MCE() {
	// conditions here
	wp_enqueue_script( 'common' );
	wp_enqueue_script( 'jquery-color' );
	wp_print_scripts('editor');
	if (function_exists('add_thickbox')) add_thickbox();
	wp_enqueue_script('media-upload');
	wp_enqueue_script('utils');
	wp_print_scripts('media-upload');
	if (function_exists('wp_tiny_mce')) wp_tiny_mce();
	wp_enqueue_style('farbtastic');

	do_action('admin_print_styles-post-php');
	do_action('admin_print_styles');
}

// add custom fields in category add form
function ts_add_texonomy_field() {

	$field_value = '';
	
	echo '
	
'; wp_editor($field_value, 'field_name'); echo '
'; } // add custom fields in category edit form function ts_edit_texonomy_field($taxonomy) { $field_value = ts_get_taxonomy_value('field_name', $taxonomy->term_id); echo ' '; wp_editor($field_value, 'field_name'); echo ' '; }

Ссылки по теме Function Reference для WordPress CMS:


Недавно столкнулся с необходимостью немного переделать один плагин для Wordress CMS, чтобы расширить его функционал.

В системе есть очень удобная фича shortcode, которая позволяет вызывать функции плагина. Мне понадобилось передавать дополнительный параметр в функцию, чтобы выбирать только те посты, которые имеют определенное значение параметра custom fields. Для примера назовем его slide_category.

Рассмотрим такой фрагмент кода:


function my_slider( $atts ) {
	global $post;

	extract( shortcode_atts( array(	'slide_category' => 0 ), $atts, 'slide_category' ) );
	/*
	...
	*/	
	$args = array(
		'post_type'  => 'slide',
		'showposts'  => -1,
		'meta_query' => array(
			array(
				'key'   => 'slide_category',
				'value' => $slide_category,
			)
		)
	);
	$qry = new WP_Query($args);
	/*
	...
	*/

}

/*
...
*/
add_shortcode('mySlider', 'my_slider');

Он позволит выводить определенную категорию слайдов. Чтобы вызвать этот функционал необходимо вставить shortcode такого вида в тело поста:

[mySlider slide_category="1"]

Если необходимо открыть доступ к какой-то одной подпапке, родительская папка которой находится под парольной защитой в Apache нужно положить файл .htaccess с таким содержимым:

Satisfy Any
Allow from all

Если есть необходимо запретить доступ к определенному файлу (some.log) в конфигурационном файле Apache .htaccess это можно сделать так:

 <FilesMatch "some\.log$"> 
Order Deny,Allow
Deny from All
 </FilesMatch> 

Чтобы изменить формат окончаний строк файла с Dos на Unix в редакторе Vim проще всего использовать команду:

:set ff=unix

Или же выполнить замену строк командой:

:%s/^M//g

чтобы встравить спец символ ^M используйте сочитание клавиш ctrl-v ctrl-m

Так же можно использовать внешнюю утилиту dos2unix, чтобы сделать это.


В работе с Vim время от времени возникает необходимость вставить вывод, полученный в результате выполнения внешней команды в файл.

Команда редактора :read может вставить файл или результат выполнения внешней команды в текущий буфер. Чтобы запустить внешнюю команду, добавьте перед ее началом символ !

Например, чтобы вставить вывод команды date необходимо выполнить команду редактора Vim

:read !date

Ссылки в сети на похожую тему:

Полезные приёмы работы в VIM


Чтобы закрыть доступ к папке на сайте всем пользователям веб сервера Apache кроме тех, чьи IP адреса указаны в списке необходимо добавить строки конфигурации в файл .htaccess, который должен находиться в этой же папке:

order deny,allow
deny from all
allow 1.22.33.4

где 1.22.33.4 - IP адрес, которому разрешен доступ в папку


При работе с Vim бывает полезно задать настройки отступов в коде.

Например, для Linux shell сркиптов я использую такую строку:

# vim:ts=2:sts=2:sw=2

Эти настройки должны находится в последней строке файла.

Для Perl сркиптов я использую такую строку:

# vim:ts=4:sts=4:sw=4

Чтобы увеличить для сайта максимальный объем загружаемого файла для PHP скриптов, если сайт работает как модуль веб сервера Apache через файл настройки .htaccess необходимо добавить строки:

 <IfModule mod_php5.c>
php_value upload_max_filesize 8M
php_value post_max_size 16M
 </IfModule>

Где 8M максимальный объем загружаемого файла.


Если нужно запретить доступ пользователям веб сервера Apache ко всем файлам в папке, то этого можно добиться такими правилами файла настройки .htaccess :


order allow,deny
deny from all


Если нужно запретить доступ пользователям веб сервера Apache ко всем файлам в папке кроме тех, чьи имена заканчиваются на .csv или .xml можно прописать такие правила в файл настройки .htaccess :

# Allow access to .csv and or .xml files
 <FilesMatch "(.*.csv|.*.xml)$">
Order allow,deny
Allow from all
 </FilesMatch>
# Deny access to all files
Order deny,allow
Deny from all

Время от времени возникает задача создать в файле .htaccess для веб сервера Apache редирект со старого имени домена на новое.

Редирект со статусом 301 означает, что сайт меняет свой постоянный адрес.

Это можно сделать добавлением таких строк в файле .htaccess на старом домене:


RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !shkodenko.com$ [NC]
RewriteRule ^(.*)$ http://shkodenko.com/$1 [L,R=301]


Эта заметка не претендует на исчерпываюеще руководство.
Это просто небольшая заметка, которая показывает один из возможных способов, возможно, не самый лучший.
Для выяснения всех деталей читайте документацию.
Для этой задачи необходимо использовать утилиту командной строки htpasswd.

1. Создание файла с паролем:

htpasswd -bcs /var/www/vhosts/shkodenko.com.ua/httpdocs/.htpasswd userName secretPassword

В данном примере мы запароливаем весь хост shkodenko.com.ua, файлы которого находятся в папке /var/www/vhosts/shkodenko.com.ua/httpdocs/
Имя пользователя userName и пароль secretPassword указываем прямо в командной строке (опция -b).
Создаем новый файл (опция -c).
Использовать SHA шифрование для пароля (опция -s).
Чтобы посмотреть все возможные варианты использования и опции служит команда htpasswd --help.

2. Обновляем .htaccess файл /var/www/vhosts/shkodenko.com.ua/httpdocs/.htaccess. Добавляем в него строки:

AuthUserFile /var/www/vhosts/shkodenko.com.ua/httpdocs/.htpasswd
AuthType Basic
AuthName "Password-protected Area"
Require valid-user


Об этом написано в документации по селекторам http://api.jquery.com/category/selectors/:
If you wish to use any of the meta-characters (#;&,.+*~\':\"!^$[]()=>|/ ) as a literal part of a name, you must escape the character with two backslashes: \\. For example, if you have an an input with name=\"names[]\", you can use the selector $(\"input[name=names\\[\\]]\").
Если вы хотите использовать какие-либо мета-символы (#;&,.+*~\':\"!^$[]()=>|/) в качестве части имени, вы должны экранировать символ с двумя слэшами: \\. Например, если у вас есть поле ввода с именем = \"names[]\", вы можете использовать селектор $(\"input[name=names\\[\\]]\").


Иногда необходимо принудительно заставить пользователя использовать шифрованное SSL (HTTPS) соединение. С помощью .htaccess это можно сделать так:


RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Теперь, для папки и всех ее подпапок, в которой находится файл .htaccess с таким содержимым будет производиться автоматическая переадресация с использованием защищенного SSL (HTTPS) соединения.


Недавно столнулся с обыденной задачей. Необхимо было перенести сайт со старого сервера на новый. И на старом и на новом севрере был установлен MySQL версии 5.

После переноса на новый сервер сайт перестал работать. Проблема оказалась в том, что не работала одна из хранимых процедур. На новом сервере не была найдена встроенная функция PREG_REPLACE.

[taras@webhome ~]$ mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.83 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT TRIM(BOTH '-' FROM PREG_REPLACE('/[\\\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. "))));
ERROR 1305 (42000): FUNCTION PREG_REPLACE does not exist

Посмотрев в поисковике я обнаружил, что это не стандрартная функция MySQL. Эта функция стандартна для PHP, а в MySQL есть UDF расширение lib_mysqludf_preg, которое выполняет аналогичные задачи.

Для установки этого расширения необходима библиотека PCRE: Perl-compatible regular expression library. Ее можно поставить через yum или из исходных текстов, как показано ниже:

[root@webhome install]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz
...
[root@webhome install]# tar -xzvf prcre-7.9.tar.gz
...
[root@webhome install]# cd pcre-7.9/
...
[root@webhome pcre-7.9]# ./configure
...
[root@webhome pcre-7.9]# make
...
[root@webhome pcre-7.9]# make install 

Установка самой библиотеки lib_mysqludf_preg из исходников выглядит так:

[root@webhome install]# wget http://mysqludf.com/lib_mysqludf_preg/lib_mysqludf_preg-0.7.0.tar.gz
...
[root@webhome install]# tar -xzvf lib_mysqludf_preg-0.7.0.tar.gz
...
[root@webhome install]# cd lib_mysqludf_preg-0.7.0
...
[root@webhome lib_mysqludf_preg-0.7.0]# ./configure
...
[root@webhome lib_mysqludf_preg-0.7.0]# make
...
[root@webhome lib_mysqludf_preg-0.7.0]# make install
...

Далее необходимо настроить MySQL. Для этого в секцию [mysqld] главного конфигурационного файла /etc/my.cnf установить значение переменной plugin_dir. В моем случае установленная библиотека lib_mysqludf_preg находится в /usr/local/lib.

После сохранения изменений в конфигурации необходимо перезапустить MySQL, например так:

[root@webhome lib_mysqludf_preg-0.7.0]# /etc/init.d/mysqld restart
Stopping MySQL:                                            [  OK  ]
Starting MySQL:                                            [  OK  ]

Теперь необходимо установить функцию PREG_REPLACE, для этого в клиенте mysql необходимо выполнить команду:

mysql> CREATE FUNCTION preg_replace RETURNS STRING SONAME 'lib_mysqludf_preg.so';
Query OK, 0 rows affected (0.08 sec)

Теперь установленную функцию можно использовать:

mysql> SELECT TRIM(BOTH '-' FROM PREG_REPLACE('/[\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. "))));
+---------------------------------------------------------------------------------------------------------------------------------------------+
| TRIM(BOTH '-' FROM PREG_REPLACE('/[\\s-]+/', '-', PREG_REPLACE('/&[\\w#]+?;|[^\\w\\s-]+/', '', LOWER(" Test string & just for test!.. ")))) |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| test-string just-for-test                                                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)

Для удаления строк, слов и символов в файле существует команда d.

Команда dd удаляет одну текущую строку, на которой находится курсор.

С помощью команды Nd и нажатия стрелки мы удаляем N симолов (строк) в зависимости от нажатой стрелки.

Команды +d и d+$ удаляют строку до конца начиная с текущей позиции курсора.

Еще полезно бывает удалить все строки с текущей и до конца файла. Для этого служат команды: d+g или :.,$d


Часто возникает необходимость проверить какой-то перенесенный на новый сервер сайт, а запись DNS еще не обновилась (или по каким-то причинам не может быть обновлена). В таких ситуациях удобно добавить IP сервера и DNS имя сайта в системный файл hosts.

Для Windows семейства NT это можно сделать так: Пуск - Выполнить...

notepad "%windir%\system32\drivers\etc\hosts"

каждая строка содержит пару значений ip-адрес и доменное имя разделенных пробелом или табуляцией.

Для Linux и Unix систем можно внести запись в /etc/hosts

каждая строка содержит ip-адрес и имена доменов, которые ему соответсвуют, разделенные пробелами или табуляцией.

Обычно файлы hosts имеют более высокий приоритет чем запросы к DNS серверу.


Чтобы узнать номер текущей строки в файле необходимо нажать комбинацию клавиш +g

Кроме этого отображается имя файла и общее количество строк в файле.


Недавно делал работы на сервере под пользователем root и обратил внимание на то, что в кроне есть задачи, с дампом баз mysql, но в параметрах подключения не были указаны имя пользователя и пароль, под которым они бы выполнялись. При этом задачи эти выполнялись нормально.

Поскольку мне еще нужно было проверить настройки сервера MySQL, то я запустил клиент mysql без параметров имя пользователя и пароль из командной строки и клиент открылся без запроса имени пользователя и пароля!

Когда я набрал команду

mysql> select user();

ответ был:

+----------------+
| user()         |
+----------------+
| root@localhost | 
+----------------+
1 row in set (0.00 sec)

В папке /root/ находился файл .my.cnf

с таким содержимым:

[client]
user=root
password=***********

Такой способ хранения пароля на первый взгляд может показаться не безопасным, но если настроить разрешения на файл правильно (chmod 600 /root/.my.cnf), то никто посторонний этот файл прочитать не сможет кроме его владельца пользователя root.

В таком случае выполнять административные задачи связанные с mysql удобнее и пароль хранится в безопасном месте.


Недавно делал одну небольшую систему на jQuery 1.3.2 и PHP4, которая по таймеру отправляла запросы к PHP-скрипту обработчику:

$.ajax({
	type: "GET",
	url: "somescript.php",
	datatype: "html",
	data: { param1: " <?=$param1?>", param2: " <?=$param2?>" },
	success: function ( data ) {
		$('#cMessages').html( 'Number of retry: ' + _max_retry + '. Status message: ' + data );
	},
	error: function ( xhr, ajaxOptions, thrownError ) {
		$('#cMessages').text('jQuery Ajax error! xhr: ' + xhr + '; ajaxOptions: ' + ajaxOptions);
	}
});

В Mozilla Firefox, Opera и Safari запросы отправлялись нормально, а вот в IE запрос отправлялся только один раз.

Причем никакого специального кеширования со стороны сервера нигде включено не было.

Немного поразмыслив решил добавить дополнительный параметр t, который каждый раз добавлял новое случайное значение к запросу:

$.ajax({
	type: "GET",
	url: "somescript.php",
	datatype: "html",
	data: { param1: " <?=$param1?>", param2: " <?=$param2?>", t: (new Date).getTime()  },
	success: function ( data ) {
		$('#cMessages').html( 'Number of retry: ' + _max_retry + '. Status message: ' + data );
	},
	error: function ( xhr, ajaxOptions, thrownError ) {
		$('#cMessages').text('jQuery Ajax error! xhr: ' + xhr + '; ajaxOptions: ' + ajaxOptions);
	}
});

После этого IE стал нормально отправлять запросы.


UPD: 2013-04-03. Теперь архив версий доступен на другой страцнице: http://php.net/releases/index.php.

Столкнулся с проблемой: необходимо загрузить исходники PHP версии 5.2.6.

На сайте ссылка была только на PHP версии 5.2.9.

Пустил поиск через Google:
download php-5.2.6.tar.bz2

И в результатах поиска увидел ссылку:
http://ua2.php.net/get/php-5.2.6.tar.bz2/from/a/mirror.

Не уверен, что там лежат все старые версии, но думаю, что такой способ поиска более ранней версии дистрибутива PHP вполне приемлим.


Данная заметка не претендует на исчерпывающее руководство по PHP, cURL, протоколу HTTPS и Cookie. Если Вы ищеете такую информацию, то заходите на официальные сайты или ищите в Google ;)

Просто хотелось показать один из можных варинатов решения поставленной задачи: необходимо заходить роботом использующим cURL по протоколу HTTPS методом POST, выполнять действия в системе и выходить из системы. Данные о сессии пользователя хранятся в Cookie.

Я не буду вдаваться в подробности и публиковать полное решение, но выложу пример связки PHP + cURL + работа по протоколу HTTPS методом POST, а так же работа с данными Cookie.

Приведу часть примера, которая может решаеть подобную задачу:

// вход в систему
// имя хоста, куда будем заходить
$hostname = 'your.seruce.host.com';
// инициализация cURL
$ch = curl_init('https://'.$hostname.'/index.php');
// получать заголовки
curl_setopt ($ch, CURLOPT_HEADER, 1); 
// если ведется проверка HTTP User-agent, то передаем один из возможных допустимых вариантов:
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
// елси проверятся откуда пришел пользователь, то указываем допустимый заголовок HTTP Referer:
curl_setopt ($ch, CURLOPT_REFERER, 'https://'.$hostname.'/index.php');
// использовать метод POST
curl_setopt ($ch, CURLOPT_POST, 1);
// сохранять информацию Cookie в файл, чтобы потом можно было ее использовать
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
// передаем поля формы
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'user=your_robot&pass=Your_R0b0t!PassWd1&mod=Login');
// возвращать результат работы
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
// не проверять SSL сертификат
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
// не проверять Host SSL сертификата
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
// это необходимо, чтобы cURL не высылал заголовок на ожидание
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:'));
// выполнить запрос
curl_exec ($ch);
// получить результат работы
$result = curl_multi_getcontent ($ch);
// вывести результат
echo "\n".'Login OK'."\n".'[result ===8<===>'."\n".$result."\n".'<===>8=== result]'."\n";
// закрыть сессию работы с cURL
curl_close ($ch);

Вот мы и вошли в систему. ID сессии, которая передается в Cookie храним в файле, который мы передали в параметре CURLOPT_COOKIEJAR. Результат работы: заголовки + тело страницы получаем и выводим из переменной $result. Пока сессия не закончится можем выполнять необходимые действия в системе.

Если вывод будет идти в командную строку Windows, а кодировка системы с которой идет работа: cp1251, то можно воспользоваться спобом описанным в заметке "chcp - изменение кодовой страницы cmd.exe", чтобы видеть вывод в нормальной кодовой странице, а не древнечукотские манскрипты cp866 установленной по-умолчанию в командном интепретаторе.

Для начала хватит. Может быть напишу как-нибудь продолжение (если кому-то это будет интересно). В этом примере отсутсвует обработка возможных ошибок. Ее необходимо добавить в реальный пример. Код примера тупо без разбора не рекомендую использовать. Но если почитать документацию, то можно на основе этого примера решать задачи подобные той, что была описана выше.


Иногда нужно эмулировать register_globals = On, когда этот параметр установлен в Off и доступа на его изменение нету. Или нужно это делать не для всего кода, а для каких-то старых и/или коряво написанных скриптов.

Тогда можно воспользоваться таким решением:

    foreach($_SERVER as $k=>$v) $$k=$v;
    foreach($_ENV as $k=>$v) $$k=$v;
    foreach($_FILES as $k=>$v) $$k=$v;
    foreach($_COOKIE as $k=>$v) $$k=$v;
    foreach($_POST as $k=>$v) $$k=$v;
    foreach($_GET as $k=>$v) $$k=$v;

которое можно поместить в отдельный файл и подключать его с помощью require_once вначале работы скрипта.


Комментарии по теме (PHP):

Alexey Miroshko: есть хорошая функция extract ;)
Отправлено: [04.11.2008 13:20:24]


Возникла задача: переименовать все файлы и папки, имена которых начинаются на символ решетки # на имена без решетки в ОС Linux. Вот как эту задачу можно красиво решить на Perl в одну строку:
perl -MFile::Find -e 'find sub{ rename $_, (m/#(.*)/)[0] }, q{.}'

Решил использовать полезную особенность Oracle под названием bind в PHP5.

Дописал для этого в свою функцию дополнительный блок кода, который передает массив в ключах название переменных, а в значениях значения, которые будут в них сохраняться.

Написал цикл, в котором будет вызываться функция oci_bind_by_name:

	foreach($array_bind as $k => $v) {
		oci_bind_by_name($s, $k, $v);
	}

Полезли ошибки Oracle. Все переменные заменялись последним передаваемым элементом массива. :( Долго не мог понять в чем дело... Пока не нашел в Интернете, что передавать значение текущего элемента массива, для функции oci_bind_by_name, нужно по ссылке, а не по значению. Так что правильный вариант вызова для цикла foreach должен выглядеть так:

	foreach($array_bind as $k => $v) {
		oci_bind_by_name($s, $k, $array_bind[$k]);
	}

Теперь пользуюсь функцией oci_bind_by_name в циклах foreach и работаю с замечательной возможностью Oracle под названием bind.


Иногда бывает, что в Mozilla Firefox скрипты написанные на языке сценариев JavaScript работают нормально, в MsIE появляется ошибка, что "Предполагается наличие }" и номер последней строки файла :(

Возможная причина этой ошибки в том, что код, который передается через Ajax запросы в MsIE "склеивается" в одну строку и любые однострочные комментарии // или отсутствие ; в конце функции вызывает ошибку.

Вывод такой: все JavaScript, которые передаются Ajax запросами, делать по-возможности без комментариев, не забывать ; в конце и тестировать на работоспособность в MsIE


Иногда бывает необходимость найти группу файлов или папок определенного и сразу же что-то с ними сделать. Для этих целей можно воспользоваться командами find, grep и xargs

Например:

  • find . -type d | grep -i _c | xargs chmod 777 - найти все папки, имена которых заканчиваются на _c, начиная с текущей директории и во всех вложенных директориях, и выполнить для них команду chmod 777 (это полезно для работы Smarty, если шаблоны, которые компилируются, хранятся в разных местах)
  • find . | xargs chown user:group - изменить права владения всех вложенных файлов и папок начиная с текущей
  • find . -type f | grep -i .txt | xargs chmod 666 - найти все файлы с расширением .txt, начиная с текущей директории и во всех вложенных директориях, и выполнить для них команду chmod 666

Вопрос казалось-бы очень простой. Есть специальный мета тег <meta name="Robots" content="...">, который должен быть размещен в шапке документа (между тегами <head>). Он указывает роботам поисковых систем как нужно индексировать сайт.
Значения поля content могут быть такими:

  • NOINDEX - запрещает индексирование документа;
  • NOFOLLOW - запрещает проход по ссылкам, имеющимся в документе;
  • INDEX - разрешает индексирование документа;
  • FOLLOW - разрешает проход по ссылкам.
  • ALL - равносильно INDEX, FOLLOW
  • NONE - равносильно NOINDEX, NOFOLLOW

Теперь ситуация из моей личной практики: пока сайт был на тестовом субдомене в шаблон был добавлен такой вариант тега: <meta name="robots" content="noindex,nofollow">
После переноса на реальный домен этот тег не убрали. В результате поисковые системы сайт не индексируют. Заказчик сайта сильно огорчен.
Вывод такой: или вообще не добавлять такие теги даже на тестовый сервер или удалять их, а лучше это делать автоматически, чтобы не забыть.
Необходимо проверять имя домена и если оно не равно тестовому - не выводить потенциально опасный тег.
Один раз написал такой код, проверил, что тег пропадает если имя домена не равно тестовому и спокойно живешь, и все довольны твоей работой.
Например, на PHP, это будет выглядеть так:

if(getenv('HTTP_HOST') != 'test.domain.kiev.ua') {
// выводить тег запрета индексации
// только на тестовом сервере test.domain.kiev.ua
	echo ' <meta name="Robots" content="noindex,nofollow">'."n";
} else {
// в остальных случаях индексировать все
	echo ' <meta name="Robots" content="all">'."n";
}

Недавно наткнулся на интересную команду chcp, которая меняет кодировку командного интерпретатора Windows NT cmd.exe

Очень часто нужно, чтобы вместо кодовой страницы cp866 (заданной по-умолчанию) данные были в cp1251 (команда chcp 1251) или в utf8 (chcp 65001).


Столкнулся с проблемой. Установил Subversion на свою рабочую станцию с Windows XP и пытался получить доступ к репозиторию на удаленном сервере через svn+ssh.
Получил такое сообщение об ошибке:
svn: Can't create tunnel: Не удается найти указанный файл.
В поисковике нашел ответ на мой вопрос в статье: How to use svn+ssh Subversion access protocol on Windows, но после того как я написал в файле %AppData%\Subversion\config строку
ssh = C:/Program Files/putty/PLINK.EXE
(у меня там находится нужный для создания тунеля файл PLINK.EXE) при попытке запустить на выполнение любую команду subversion (например, svn up) получаю мигающий курсор и ничего не происходит :(

Проблема решилась только добавлением ключа -pw и пароля. Только после этого команда svn up отработала отлично.


Статьи на похожую тему (SVN):

Как проверить работоспособность отправки почты на сервере mail.server.ua используя утилиту telnet?

  1. Команда для входа на почтовый сервер:
    telnet mail.server.ua 25
    Trying aaa.bbb.ccc.ddd...
    Connected to mail.server.ua (aaa.bbb.ccc.ddd).
    Escape character is '^]'.
    220 mail.server.ua ESMTP Sendmail x.y.z/x.y.z; Fri, 7 Mar 2008 10:09:22 +0200
  2. Введите команду приветствия: helo eee.fff.ggg.hhh
    (где eee.fff.ggg.hhh ваш IP-адрес с которого вы запустили telnet)
    250 mail.server.ua Hello mail.server.ua [aaa.bbb.ccc.ddd] pleased to meet you
  3. Укажите адрес отправителя (должен быть в том же домене, что и почтовый сервер: server.ua)
    mail from: taras@server.ua
    250 2.1.0 taras@server.ua... Sender ok
  4. Укажите адресата (mailto@mail.kiev.ua):
    rcpt to: mailto@mail.kiev.ua
    250 2.1.5 taras... Recipient ok
  5. Введите команду data
    354 Enter mail, end with "." on a line by itself
  6. Subject: тема тестового письма
  7. Текст письма,
    а в конце письма одну точку в строке, чтобы закончить
    .
  8. 250 2.0.0 x2789MjQ008048 Message accepted for delivery
  9. Введите для выхода
    quit
  10. 221 2.0.0 mail.server.ua closing connection
    Connection closed by foreign host.

Статьи на похожую тему (telnet):

Часто возникают вопросы:

  • как посмотреть проиндексирован ли сайт в поисковой системе?
  • сколько страниц сайта и как проиндексированы в поисковой системе?

Для ответа на эти вопросы необходимо составить специальный запрос.

Вот примеры такого запроса для поисковых систем Google и Yandex.

Посмотреть как проиндексирован этот сайт в поисковой системе Google

Посмотреть как проиндексирован этот сайт в поисковой системе Yandex

Жаль что у каждой поисковой системы разный синтаксис таких команд.


Недавно бродил по просторам Wikipedia и забрел на страницу про PHP.

В разделе пасхальные яйца написано, что если обратиться к любому скрипту в PHP со специальными параметрами, то можно получить картинку или список разработчиков PHP4

Естественно, что в PHP5 этих пасхальных яиц нет.

Теперь можно легко определить если на сервере установлен PHP4. Просто запросить любой сценарий с волшебным параметром.

И еще один побочный еффект: теперь любой знающий эти свойства PHP4 программист или хакер может определить есть ли на сервере файл с каким-то именем. Если да - получит содержимое пасхальных яиц PHP4. Если нет 404-ю ошибку. Можно конечно поменять структуру хранения файлов. Еще как вариант: убрать или поменять расширения, что не всегда удобно или возможно.

Одним словом есть над чем подумать.


У меня недавно возникла задача. Необходимо было сделать переадресацию всех страниц с одного домена на другой (с сохранением структуры всех URL-ов).

Решается эта задача с помощью .htaccess так:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain.ua [NC]
RewriteRule ^(.*)  http://domain.ua/$1 [L,R=301]

Теперь все страницы будут переадресованы на другой домен: domain.ua с сохранением структуры и поисковые системы проиндексируют изменение старого домена на новый.


Иногда возникает задача добавить пользователя на сервер с FreeBSD и разрешить ему доступ по SSH.

Для работы с учетными записями во FreeBSD удобно использовать набор утилит pw

Пример добавления пользователя podlom выглядит так:
pw useradd podlom -G wheel -s /bin/tcsh -m -d /home/podlom

Опции:

  • -G - добавить полнителя в группу wheel (нужно, чтобы можно было по SSH заходить)
  • -s - оболочка (список доступных вариантов можно посмотреть more /etc/shells)
  • -m - создать домашнюю директорию пользователю
  • -d - путь к домашней директории пользователя

Другие опции утилиты pw можно посмотреть на странице справки man pw

После добавления меняем пароль пользователю: passwd podlom

Но это еще не все. Если пользователь не может зайти после всех ранее проделанных действий необходимо проверить файл конфигурации демона sshd vi /etc/ssh/sshd_config

Если в конфигурационном файле есть строки в AllowUsers userok , то под ними добавляем AllowUsers podlom


Недавно купил ноутбук HP Compaq 6720s без установленной ОС.

По-умолчанию на такого рода ноутбуки устанавливают Windows Vista. Поскольку эта версия ОС более требовательна к ресурсам, то и электропитания она больше потребляет, а для работы на ноутбуке это критично. К тому же не все необходимое мне ПО работает с Windows Vista. Поэтому решил перейти на давно знакомую Windows XP Professional SP2 Russian.

Для установки ОС Windows XP на HP Compaq 6720s необходима интеграция драйверов SATA в дистрибутив программой N-Lite аналогично тому способу, который я описывал ранее.

Закачал все драйвера с официального сайта HP и установил все те, что были мне нужны.

Из неприятных сюрпризов:

  1. драйверов для встроенного модема VEN_11С1&DEV_1040 (полный код экземпляра устройства:
    HDAUDIO\FUNC_02&VEN_11С1&DEV_1040&SUBSYS_103C1378&REV_1002\4&1ADBBA33&0&0101
    ) там не нашел;
  2. драйверов на еще одно неизвестное устройство ACPI\HPQ0006\2&DABA3FF&0 тоже не было;
  3. сеть не работает.

Лекарство на первые 2 проблемы нашел на форуме forum.ru-board.com нашел ссылки на драйвера таких устройств как: модем VEN_11С1&DEV_1040 и HP Quick Launch Buttons.

С последней проблемой мне помог справиться форум на сайте http://noutbukov.net/. Обновил BIOS утилитой HP под Windows и после перезагрузки системы сеть сразу же заработала.

Вывод из этой истории такой: если для вашего нового ноутбука нету каких-то драйверов поищите решение в сети Интернет на специализированных форумах. Наверняка кто-то уже сталкивался с подобной проблемой и подскажет как ее проще решать.


Статьи на похожую тему (Windows XP):

Чтобы заставить систему управления XCMSpro версии 2.1.2 работать с SVN репозиторием необходимо в файле "lib\Loader.lib.php" в функции function getLibFiles($dirPath,$files='') поменять условие отбора файлов. Вместо

elseif($file!='.' && $file!='..' && is_dir($filename))
поставить
elseif($file!='.' && $file!='..' && $file!='.svn' && is_dir($filename))


Статьи на похожую тему (SVN):

  • 200 - OK
  • 201 Created
  • 202 Accepted
  • 203 Provisional Information
  • 204 No Content
  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Moved Temporarily
  • 303 Method
  • 304 Not Modified
  • 400 Bad Request - неправильный запрос
  • 401 Authorization Required - ошибка авторизации
  • 402 Payment Required
  • 403 Forbidden - нет доступа
  • 404 Not Found - документ не найден
  • 405 Method Not Allowed
  • 406 None Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
  • 500 Internal Server Error - внутренняя ошибка скрипта
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout

Недавно подсказали классный способ делать редирект через запрос к поисковой системе. Вот пример такой ссылки с редиректом через поисковую систему Google: портал информации для веб-разарботчика.


Многооконность в shell (командной строке) в Unix-подобных системах (FreeBSD , Linux и др.) - это не миф. Программа screen (скрин) поможет в этом.

Установка screen (скринов) во FreeBSD:

office-srv$ su

office-srv# cd /usr/ports/*/screen

office-srv# pwd

/usr/ports/sysutils/screen

make install clean

===>  Vulnerability check disabled, database not found
=> screen-4.0.3.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from ftp://ftp.iptelecom.net.ua/pub/FreeBSD/distfiles/.
fetch: ftp://ftp.iptelecom.net.ua/pub/FreeBSD/distfiles/screen-4.0.3.tar.gz: Not logged in
=> Attempting to fetch from ftp://ftp.lucky.net/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp.lucky.net/pub/FreeBSD/ports/distfiles/screen-4.0.3.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from ftp://ftp.ukr.net/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp.ukr.net/pub/FreeBSD/ports/distfiles/screen-4.0.3.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from ftp://ftp7.ua.freebsd.org/pub/FreeBSD/ports/distfiles/.
fetch: ftp://ftp7.ua.freebsd.org/pub/FreeBSD/ports/distfiles/screen-4.0.3.tar.gz: File unavailable (e.g., file not found, no access)
=> Attempting to fetch from ftp://ftp.uni-erlangen.de/pub/utilities/screen/.
screen-4.0.3.tar.gz                            41% of  820 kB   21 kBps 00m22s
...
/usr/local/bin/screen

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
http://www.gnu.org/software/screen/
===>  Cleaning for screen-4.0.3

после установки:

office-srv# rehash


А теперь вкратце о том как работать со screen (скринами) во FreeBSD.

Команды для работы со screen (скринами):

- начинаем работу с создания скрина: # screen -a

- создание окон screen_name: # screen -t screen_name

- создание нового окна: [ Ctrl + a + c ]

- удаление окна: [ Ctrl + d ]

- переключение между двумя последними открытыми окнами: [ Ctrl + a ]

- переключение на следующее открытое окно: [ Ctrl + a + n ]

- переключение на предыдующее открытое окно: [ Ctrl + a + p ]

- отключение от окон: [ Ctrl + a + d ]

- подключение к окнам: # screen -dr

- после выхода к сессии можно вернуться при помощи: # screen -r

- после аварийного выхода, отсоединение от скрина не всегда регистрируется, при попытке повторного подключения выдается сообщение о том, что скрин активен, подключиться невозможно. Подключение к такому скрину выполняется при помощи: # screen -x

Выражаю благодарность Евгению Нечипоренко и Ивану Фитенко (sin) за полезную информацию благодаря которой эта заметка появилась.


У меня возникла необходимость сделать переадресацию на адреса с www через 301 редирект в PHP. Возможно я это сделал кустарным методом, но главное, что она работает нормально :)

$http_host = getenv('HTTP_HOST');
$t1 = substr($http_host, 0, 4);
$t2 = 'www.';
if($t1 != $t2)
{
	$location = 'http://www.'.getenv('HTTP_HOST').getenv('REQUEST_URI');
	header("HTTP/1.1 301 Moved Permanently");
	header("Location: $location");
	exit;
}

Как удалить Windows Messenger и прочие стандартные компоненты Windows XP, которые не нужны для работы?

Последовательность действий:

  1. Открываем блокнот (notepad.exe)
  2. Открываем файл %windir%\inf\sysoc.inf
  3. Выбираем "Правка" - "Заменить" и заменяем слово hide на пустую строку :)
  4. Сохраняем файл
  5. Запускаем "Панель управления" - "Установка/Удаление программ" - "Установка компонентов Windows"

...и видим кучу скрытых ранее компонентов, которые можно смело удалять (если они не нужны). :)

© -= Iton =-


Статьи на похожую тему (Windows XP):

Купили новый ноутбук Acer Extensa 6150.

На нем был установлен какой-то обрезанный китайский Live CD Linux.

Поскольку Windows Vista требовательна к ресурсам - решили поставить Windows XP.

Стандартный дистрибутив Windows XP не содержал драйверов SATA контроллера. Пришлось взять драйвера для установки с официального FTP Acer.

Дисковода флоппи дисков в новом ноутбуке не предусмотрено. Скопировал драйвера через дисковод в другом компьютере.

В Интернете нашел много полезной информации про интеграцию недостающих драйверов контрллера SATA в дистрибутив Windows XP.

Решил начать со способа интеграции описанного на сайте OSZone.net

Пошагово выполнил все инструкции, создал образ, записал его, загрузился - драйвера не определяются.

Взял утилиту N-Lite, сделал интеграцию, создал образ, записал его - установка прошла успешно.

В процессе установки драйверов возникли проблемы только с модемом. Исполняемый файл выдавал ошибку: модема нет.

Установил драйвер модема альтернативным способом: обновление драйвера с указанного места (где лежат необходимые драйвера).

Теперь ноутбук нормально работает.

Вывод: не всегда верьте тому, что написано в сети Интернет. Если есть средство, которое качественно автоматизирует сложный и рутинный процесс - лучше воспользоваться им.


Статьи на похожую тему (Windows XP):

По моему опыту одним из самых лучших бесплатных редакторов для программистов в среде Windows Notepad++. У него очень удобный интерфейс, а так же очень богатый инструментарий по работе с разными языками программирования.

В последнее время в больших проектах все чаще стали использоваться системы контроля версий. В настоящее время одной из самых популярных систем контроля версий можно назвать Subversion.

Для работы с этой системой контроля версий в среде операционной системы Microsoft Windows удобно использовать plugin TortoiseSVN, который встраивается в оболочку системы Explorer.

При постоянной работе в редакторе удобнее вызывать команды по работе с репозиторием прямо из среды разработки. Для этого необходимо создать пользовательские команды, которые будут производить нужные программисту действия:

  • add;
  • commit;
  • update;
  • diff;
  • lock;
  • unlock;
  • revert;
  • и другие…

Чтобы настроить такую среду разработки необходимо:

  • установить редактор Notepad++;
  • установить plugin TortoiseSVN;
  • изменить системную переменную среды Path и добавить путь к папке с исполняемыми файлами TortoiseSVN (например «%programfiles%\TortoiseSVN\bin;»);
  • прописать в файле настроек пользовательских команд (например «%appdata%\Notepad++\shortcuts.xml») команды по работе с репозиторием.

Пример моего файла:


    
    
        firefox "$(FULL_CURRENT_PATH)"
        iexplore "$(FULL_CURRENT_PATH)"

        http://www.php.net/%20$(CURRENT_WORD)
        http://www.google.com.ua/search?q=$(CURRENT_WORD)
        http://ru.wikipedia.org/wiki/Special:Search?search=$(CURRENT_WORD)
        $(NPP_DIRECTORY)\notepad++.exe $(CURRENT_WORD)

        $(NPP_DIRECTORY)\notepad++.exe $(CURRENT_WORD) -multiInst
		TortoiseProc.exe /command:add /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Add log message" /notempfile
        TortoiseProc.exe /command:commit /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Commit log message" /notempfile
        TortoiseProc.exe /command:update /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Update log message" /notempfile /rev

		TortoiseProc.exe /command:diff /path:"$(FULL_CURRENT_PATH)" /notempfile
        TortoiseProc.exe /command:lock /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Lock log message" /notempfile
        TortoiseProc.exe /command:unlock /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Unlock log message" /notempfile
        TortoiseProc.exe /command:revert /path:"$(FULL_CURRENT_PATH)" /logmsg:"Notepad++ Revert log message" /notempfile

    
    
        
            
            
            

            
            
            
            
        
        

            
        
    


Статьи на похожую тему (SVN):

Эта заметка не претендует на право быть первоисточником информации связанным с администрированием сервера subversion (SVN). Она скорее создавалась для того, чтобы можно было быстро решить конкретную прикладную задачу. Я не могу дать никаких гарантий, что все написанное ниже у вас заработает и вам поможет. Воспринимайте это как отправную точку для решения конкретной задачи.

Для того, чтобы установить сервер subversion (SVN) на FreeBSD необходимо:

  • зайти с правами root
  • выполнить команды:
  • cd /usr/ports/devel/subversion
  • make clean install && make clean
  • подождать пока все что нужно установится
  • отредактировать скрипт запуска системы vi /etc/rc.conf
  • добавить в него строки:
  • svnserve_enable="YES"
  • svnserve_flags="-d --listen-port=3690"
  • svnserve_data="/home/svn/repositories"
  • svnserve_user="svn"
  • svnserve_group="svn"
  • сохранить изменения и выйти из редактора Vi команда :wq
  • создать директории для репозиториев mkdir -p /home/svn/repositories
  • добавить группу SVN pw group add svn
  • и пользователя SVN в одноименную группу pw user add svn -g svn -s /sbin/nologin -d /home/svn/repositories/

Запуск сервера subversion: /usr/local/etc/rc.d/svnserve start

Перезапуск сервера subversion: /usr/local/etc/rc.d/svnserve restart

Создание и базовая настройка репозитория:

  • Для примера создадим репозиторий под названием htdocs, который будет храниться в директории /home/svn/repositories/htdocs/
  • svnadmin create /home/svn/repositories/htdocs/
  • chown -R svn:svn /home/svn/
  • Теперь настроим репозиторий так, чтобы анонимные пользователи не имели к нему доступа, а изменения могли вносить только разегистрированые пользователи
  • cd /home/svn/repositories/htdocs/conf
  • vi svnserve.conf
  • раскомменитруем строки
  • anon-access = none
  • auth-access = write
  • password-db = passwd
  • сохраним изменения и выйдем из редактора командой :wq
  • теперь в файле passwd создаем пользователей, которые могут работать с репозиторием в формате логин = пароль
  • перезапускаем сервер subversion: /usr/local/etc/rc.d/svnserve restart
  • работаем с созданным репозиторием

Статьи на похожую тему (SVN):
Статьи на похожую тему (FreeBSD):

Как проверить работоспособность почты на сервере mail.server.ua используя утилиту telnet?

  1. Команда для входа на почтовый сервер:
    telnet mail.server.ua 110
  2. Задать имя пользователя: user user@server.ua
  3. Задать пароль для пользователя: pass PassW0rd
  4. Получить список писем: list
  5. Прочитать письмо retr x (где x - это номер письма)
  6. Для выхода введите команду quit

  7. Статьи на похожую тему (telnet):