Автогенератор Sitemap.xml и Sitemap.xml.gz для сайта/ов
Сайт https://anteh.ru
Последние изменения:
27.10.2015 -в скрипте нужно webcheck заменить на webchrck.py
24.10.2015 Установка FreeBSD 10.2 webcheck 1.10.3_1, google-sitemapgen 1.5
04.01.2016 Усовершенствованный скрипт автоматической генерации sitemap для заданного списка хостов с учётом совместно работающего mod_security
Для сайта формируются и .xml и .xml.gz. Предполагается, что у Вас есть сервер FreeBSD и Вам нужно для какого-либо сайта сформировать Sitemap.xml и Sitemap.xml.gz. Если сервера под рукой нет, то формирование Sitemap файлов можно произвести на существующих для этого сервисах. Если страниц немного 500-1500, то это как правило бесплатно.
Нужно:
1.Выбрать всех url. Через webcheck порт.
2.Фильтрация, выбор нужных файлов сайта. Скрипт.
3.Генерация Sitemap.xml и Sitemap.xml.gz по стандарту google. При помощи google-sitemapen порта.
Формировать .xml.gz файл Sitemap можно в случае, если размер файла, согласно протоколу http://sitemaps.org/ru/protocol.php, превысит 10 мегабайт. В robots.txt можно указывать и .xml и .xml.gz файлы для одного сайта. Робот сам выберет наиболее свежий из них. Есть и ограничение в 50 000 урлов на один Sitemap. Для больших сайтов Sitemap файлов может быть несколько.
Обновляем FreeBSD порты.
Устанавливаем:
#webcheck /usr/ports/www/webcheck
#google-sitemapgen /usr/ports/www/google-sitemapgen
Конфигурационные файлы:
/usr/local/share/webcheck/config.py #конфигурационный файл webcheck можно не настраивать.
/etc/sitemap/sitemapgen.site1.ru.xml.conf #конфигурационный .xml файл google-sitemapen для site1.ru
/etc/sitemap/sitemapgen.site1.ru.xml.gz.conf #конфигурационный .xml.gz файл google-sitemapen для site1.ru
/etc/sitemap/sitemapgen.site1.com.conf #конфигурационный файл google-sitemapen для site1.com
В приводимом примере, для .ru формируем и.xml и .xml.gz, для .com только .xml -так захотелось).
Файл конфигурации google-sitemapen, может иметь любое имя и располагаться где угодно, содержимое sitemapgen.site1.ru.xml.conf:
<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.ru/"
store_into="/path/site1.ru/Sitemap.xml"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>
|
sitemapgen.site1.ru.xml.gz.conf:
<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.ru/"
store_into="/path/site1.ru/Sitemap.xml.gz"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>
|
sitemapgen.site1.com.conf:
<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.com/"
store_into="/path/site1.com/Sitemap.xml"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>
|
Создаём скипты /etc/sitemap/site1.ru.sitemapgen и /etc/sitemap/site1.com.sitemapgen.
/etc/sitemap/site1.ru.sitemapgen:
#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://site1.ru/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}
| awk '!/(\/|\.css|\.gif|\.jpeg|\.jpg|\.js)$/' | sort \
| awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$la
else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt
/usr/local/bin/python /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.site1.ru.xml.conf
/usr/local/bin/python /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.site1.ru.xml.gz.conf
rm -Rf $folder
|
/etc/sitemap/site1.com.sitemapgen:
#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://site1.com/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}
| awk '!/(\/|\.css|\.gif|\.jpeg|\.jpg|\.js)$/' | sort \
| awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$la
else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt
/usr/local/bin/python /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.site1.com.conf
rm -Rf $folder
|
...|\.css|\.gif|\.jpeg|\.jpg|\.js... тут перечисляем типы файлов, которых не будет в Sitemap файлах.
Собственно запуск скрипта:
# /bin/sh /etc/sitemap/site1.ru.sitemapgen
После окончания увидим подоюный вывод:
...
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/path/site1.ru/Sitemap.xml" with 54 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
54 .html
Number of errors: 0
Number of warnings: 0
Reading configuration file: /sitemap/sitemapgen.site1.ru.xml.gz.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/path/site1.ru/Sitemap.xml.gz" with 54 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
54 .html
Number of errors: 0
Number of warnings: 0
|
Разумеется необходимо подключение к internet для построения sitemap любого сайта, находящегося как на текущем сервере, так и на любом другом.
Возможные проблемы:
Проверить версию python2.7 -должна соответствовать установленной
/usr/local/share/webcheck/config.py -запретить использование файла robots.txt при построении карты сайта, установить USE_ROBOTS = False
Конфигурация webcheck хранится в файле /usr/local/share/webcheck/config.py. Для того, чтобы отключить не нужные в нашем случае схемы сканирования и плагины, формирующие отчеты, в файле config.py необходимо изменить: PLUGINS = ['sitemap'] -достаточно только этого параметра. Оставлял всё как было.
Версия webcheck 1.10.3 формирует index.html и urllist.html. index.html содержит карту сайта в виде многоуровневого списка, urllist.html - в виде одноуровневого. Можно вытащить список URL'ов из любого из них.
Установка FreeBSD 10.2 webcheck 1.10.3_1, google-sitemapgen 1.5
Ставим:
#webcheck-1.10.3 /usr/ports/www/webcheck
#google-sitemapgen-1.5 /usr/ports/www/google-sitemapgen
Если запустить вышеприведённый скрипт, то получаем такую ошибку:
# /bin/sh /<path>/sitemap/anteh.ru.sitemapgen
env: python: No such file or directory
cat: urllist.html: No such file or directory
/<path>/sitemap/anteh.ru.sitemapgen: /usr/local/bin/python: not found
/<path>/sitemap/anteh.ru.sitemapgen: /usr/local/bin/python: not found
|
"env: python: No such file or directory" строка генерируется /usr/local/bin/webcheck.py. Смотрим файл @webcheck.py, первой строкой идёт "#!/usr/bin/env python". Python находится в /usr/local/bin директории, но там только @python2. В файле /usr/local/bin/webcheck.py меняем первую строку на "#!/usr/bin/env python2" и скрипт редактируем до такого состояния:
#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://site.ru/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}}' \
| awk '!/(\/|\.css|\.gif|\.jpeg|\.png|\.ogg|\.ogv|\.dll|\.rar|\.gz|\.pdf|\.tar|\.jpg|\.js|\.mpeg)$/' | sort \
| awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$lastmod'"} \
else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt
/usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.anteh.ru.xml.conf
/usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.anteh.ru.xml.gz.conf
rm -Rf $folder
|
В общем в 3х местах к python добавляем цифру "2". Результат работы скрипта 2 файла, сайтмап и его сжатая версия. Файлы будут сформированы в корневой директории сайта. Желательно сделать резервные копии старых файлов сайтмапа
...
Reading configuration file: /<path>/sitemapgen.site.ru.xml.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/<path>/site.ru/Sitemap.xml" with 74 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
73 .html
Number of errors: 0
Number of warnings: 0
Reading configuration file: /<path>/sitemapgen.site.ru.xml.gz.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/<path>/site.ru/Sitemap.xml.gz" with 74 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
73 .html
Number of errors: 0
Number of warnings: 0
#
|
Усовершенствованный скрипт автоматической обработки заданного списка хостов с учётом совместно работающего mod_security. mod_security автоматически отключается на время генерации sitemap
Скрипт
Пример sitemap файла конфигурации .xml.conf
Пример sitemap файла конфигурации .xml.gz.conf
#!/usr/local/bin/bash set -o nounset set -o errexit #/usr/local/bin/bash /<script directory>/sitemap/sitemapgen
#=== CONFIG ============================ #Apache virtual host configuration file VHostNameOr="/usr/local/etc/apache24/extra/httpd-vhosts.conf" #Add host to handle Host=(anteh.ru anteh.com adc.anteh.ru site.ru) #Soft apache restart. Handle each host separately MODE="seq" #Hard apache restart. Handle all hosts simultaneously. apachectl restart #MODE="all" #Dir with config for sitemap files HostConfDir="/<script directory>/sitemap" #---------------------------------------
host_handle() { lastmod=`date +"%Y-%m-%d"` folder=/tmp/webcheck if [ ! -d $folder ] then mkdir $folder fi cd $folder /usr/local/bin/webcheck.py -afq http://$1/ cat urllist.html \ | awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}}' \ | awk '!/(\/|\.css|\.gif|\.jpeg|\.png|\.ogg|\.ogv|\.dll|\.rar|\.gz|\.pdf|\.tar|\.jpg|\.js|\.mpeg)$/' | sort \ | awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$lastmod'"} \ else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt /usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \ --config=$2/sitemapgen.$1.xml.conf /usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \ --config=$2/sitemapgen.$1.xml.gz.conf rm -Rf $folder }
#${Hosts[@]} $VHostName offf(){ #=== Correction of Hosts for regular expressions declare -a HostsReg=(${Hosts[@]}) if (( ${#HostsReg[@]}>0 )); then i=-1 for a in "${HostsReg[@]}"; do i=$((i+1)) HostsReg[i]=`echo $a | sed 's/\./\\\./g'` done fi echo "=- HOSTS: ${Hosts[@]} ==" readarray vh < $VHostNameOr
#Handle array if (( ${#vh[@]}>0 )); then i=-1 start=0 last=0 SecRulEng_present=false cat /dev/null > $VHostNameOr for a in "${vh[@]}"; do #Handle all file i=$((i+1)) if [[ $a =~ ^[[:space:]]*\<VirtualHost.*\>{1}[[:space:]]*$ ]]; then start=$i fi if [[ $a =~ ^[[:space:]]*\</VirtualHost\>[[:space:]]*$ ]]; then flag=true str=$start SecRulEng_present=false while [ $str -le $i ] #Search ServerName marker do if $flag ;then #FIRST if [[ ${vh[$str]} =~ ^[[:space:]]*ServerName[[:space:]]*.*$ ]]; then for b in "${HostsReg[@]}"; do #Find host if [[ ${vh[$str]} =~ ^[[:space:]]*ServerName[[:space:]]*$b[[:space:]]*$ ]]; then echo ${vh[$str]} flag=false str=$[$start-1] break fi done fi else #Handle Vhost block SECOND if [[ ${vh[$str]} =~ ^[[:space:]]*SecRuleEngine[[:space:]]*.*[[:space:]]*$ ]]; then vh[$str]="SecRuleEngine Off"$'\n' SecRulEng_present=true #SecRuleEngine was changed no need to create fi fi str=$[$str+1] done
while [ $last -lt $i ] #Add Block to out FIRST do #echo ${vh[$last]} >> "$VHostNameOr" printf "%s" "${vh[$last]}" >> "$VHostNameOr" if ! $flag && ! $SecRulEng_present ;then if [[ ${vh[$last]} =~ ^[[:space:]]*\<VirtualHost.*\>{1}[[:space:]]*$ ]]; then #echo "SecRuleEngine Off" >> "$VHostNameOr" printf "%s\n" "SecRuleEngine Off" >> "$VHostNameOr" fi fi last=$[$last+1] done fi done while [ $last -lt ${#vh[@]} ] #Add Block to out SECOND do #echo ${vh[$last]} >> "$VHostNameOr" printf "%s" "${vh[$last]}" >> "$VHostNameOr" last=$[$last+1] done fi }
declare -a Hosts=() #=== Check mod_security LoadModule mod_security_activated=false if echo `apachectl -M` | egrep -q '.*security2_module \(shared\).*';then mod_security_activated=true echo "=- mod_security Detected ==" fi if $mod_security_activated ;then #Change SecRuleEngine On to Off if mod_security loaded
#=== Rezerv copy create =============== VHostName=$VHostNameOr"_rzq0" i=0 while [ -f $VHostName ] do if [ $i -ge 5 ];then #Create only 5 rezerved copy cyclic i=0 rm $VHostNameOr"_rzq$i" fi VHostName=$VHostNameOr"_rzq$i" i=$[$i+1] done cp $VHostNameOr $VHostName #Reserv copy echo "=- Rezerv file: "$VHostName
if [ $MODE == "all" ];then Hosts=("${Host[@]}") offf apachectl restart ia=0 while [ $ia -lt ${#Hosts[@]} ] #Add Block to out SECOND do host_handle ${Hosts[$ia]} $HostConfDir ia=$[$ia+1] done cp $VHostName $VHostNameOr apachectl restart fi
if [ $MODE == "seq" ];then ib=0 while [ $ib -lt ${#Host[@]} ] #Add Block to out SECOND do Hosts=("${Host[$ib]}") offf apachectl -k graceful host_handle ${Hosts[0]} $HostConfDir cp $VHostName $VHostNameOr ib=$[$ib+1] done #cp $VHostName $VHostNameOr apachectl -k graceful fi echo "=- Return SecRuleEngine to last value ==" exit 0 else echo "=- Mod_security Not Detected =="
ib=0 while [ $ib -lt ${#Host[@]} ] #Add Block to out SECOND do Hosts=("${Host[$ib]}") host_handle ${Hosts[0]} $HostConfDir ib=$[$ib+1] done apachectl -k graceful
fi exit 0
|
Скрипт автоматически отключает mod_security для перечисленных хостов. Реализовано 2 режима. В первом режиме отключается mod_security для всех перечисленных хостов, "жёстко" перезапускается апач apachectl restart и производится формирование sitemap файлов для каждого из перечисленных хостов. Отключение mod_security для каждого из указанных хостов производится через "SecRuleEngine Off" директиву, скриптом добавляемую в конфигурационном файле апача.
Во втором режиме производится мягкий перезапуск апача "apachectl -k graceful", причём каждый из указанных хостов обрабатывается индивидуально. Для каждого хоста производится установка опции "SecRuleEngine Off", мягкий перезапуска апача, генерация сайт мап файлов. Т.е. mod_security для обрабатываемого хоста отключён только на время генерации sitemap файлов.
Если mod_security не подключен, то просто производится генерация sitemap для указанных хостов, без изменеия конфигурационного файла апача.
Циклически создаётся 5 резервных копий указанного конфигурационного файла апача.
Не делаются резервные копии старых файлов sitemap.
Нужно реализовать вывод данных в лог файл иначе трудно судить, сколько чего было преобразовано.
Можно ещё директиву echo поменять на printf, в критичных местах используется printf.
echo не точно делает запись в файл, например убирает первые пробелы табуляции или вообще портит строку:
" RewriteRule ^(.*)$ http://anteh.com/$1 [L,R=301]"
меняет на строку
"RewriteRule ^(.*)$ http://anteh.ru/$1 0 1"
И собственно, цитата:
"printf команда была создана для замены всем знакомой команды echo, настолько древней, что даже имя ее автора не известно. Возможности команды echo ограничены, кроме того, в разных ветках Unix'а оказались разные ее версии, что приводит к несовместимости. Поэтому Posix рекомендует пользоваться командой printf.
Добавление возврата строки в текущую строку:
string="some text"$'\n'
Нужно проверить сайт на правильные ссылки на https://validator.w3.org/checklink. Неправильно, когда ссылка на сайте вида http://../notes_a1.html. Проблема в "../" этого сочетания символов в ссылках не должно быть. Иначе проблемы с индексацией. Появятся дубли записей в sitemap файле и сылок станет больше, чем на самом деле. Браузеры такие неправильные ссылки обрабатывает нормально. Но для поисковых роботов это неправильная запись. Пример проверки страниц с подобными ошибками:
List of broken links and other issues
There are issues with the URLs listed below. The table summarizes the issues and suggested actions by HTTP response status code.
Code Occurrences What to do
400 21 This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link.
error Line: 34 https://anteh.ru/../apg2.html
Status: 400 Bad Request
This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link.
error Line: 39 https://anteh.ru/../apg7.html
Status: 400 Bad Request
This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link.
...
|