CGI

Публикувано от turin

Тази тема е малко встрани от новините за свободен софтуер. Но понеже много хора използват свободен софтуер за страниците си в Интернет, много често без самите да знаят за възможностите, които им дава това и за многото начини, по които могат да експлоатират услугата на хостингите, ползващи свободен софтуер, нека поговорим за уеб-пренасочванията.

Всяка заявка до уеб-сървъра Apache получава някакъв отговор. Той в повечето случаи е невидим за потребителя на сайта, защото е задействан, но не е предвиден за показване или защото е предвидено от програмистите и администраторите да се показва, но не е бил задействан. В първия случай става дума за кодове за "нормално състояние". Например отговор, че обектът се доставя или отговор, че обектът е преместен и може да се намери на еди-кой си адрес. Във втория случай става дума за кодове и придружаващите ги обяснителни съобщения, които означават някаква грешка. Била тя в сървъра, задействана от самия сървър, средата му или уеб-приложението или била от страна на клиента, в браузъра му.

Кодовете за състоянието на заявките се изписват в лог-файловете на сървъра, най-често в шестото поле на всеки ред. Полетата са разделени с интервал и някои от тях (например тези, които могат да съдържат разделителя, интервал в себе си) са оградени в кавички. Въпросното шесто поле съдържа трицифрено число, което е кодът за състоянието на заявката, върнат от сървъра. Тези кодове са доста и различни, но най-често срещаните и най-използваните при разработката на сайтове и проверката за грешки са сравнително малко на брой.

Тези от тях, които се отнасят до пренасочванията, започват с цифрата 3. Добре е всеки с интереси и занимания в областта на уебсайтовете, правенето, администрирането и поддържането им, или казано накратко всеки имащ нещо общо с HTTP да ги познава. Много често бързото поставяне на пренасочване е важно за оптимизацията на сайта за търсачки и за "задържане" на потребители при преместване, например.

Когато се настройва сървърът да връща код 3хх (някое от пренасочванията), задължително е и да се посочи като допълнителен аргумент адресът на пренасочването. Тоест къде да отиде клиентът, след като сървърът му е казал "има пренасочване". Адресът се изписва като стандартен URI-запис, тоест включва протокол, сървър, евентуално порт и евентуално път — http://example.com:8080/newsite например.

Видове пренасочване

постоянно (permanent) — връща се код за състояние "301" и това означава, че съдържанието е постоянно преместено на указания нов адрес. Предполага се, че настолните приложения и индексиращите машини на търсачките автоматично при посещение на адреса с постоянното пренасочване ще променят данните си. Например Google ще знае за новия адрес и вече ще показва предимно него и браузърите при посещаване на такъв сайт сами ще си променят записа в отметките си. Все пак трябва да се има предвид, че такава "миграция" за търсачката на Google отнема от месец до два или три. Чак след това се възвръща и PageRank-а, който при такова преместване в началото се нулира за новия адрес.

временно (temp) — връща се код за състояние "302", което означава, че временно съдържанието е на новия адрес. Ако е използвана директивата Redirect в настройката на сървъра (или съответно в .htaccess), но не е указан изрично кой код да се върне, това е подразбиращият се код.

замяна (seeother) — връща се код за състоянието "303", показващ че съдържанието е било заменено и всичко, което е било на предишния адрес, сега е смислово заменено от съдържанието на новия адрес. Това не е точно пренасочване и в днешното време на използване на аргумента "rel" към препратките за изразяване на смислово отношение се ползва много рядко.

премахнато (gone) — връща се код за състоянието "410". Това не е пренасочване в истинския смисъл, защото практически на клиента се връща код за грешка (каквито са тези, започващи с "4"). Понеже клиентът не се пренасочва наникъде след посещението, затова и не е нужно да се указва нов адрес. Споменаваме "410" при пренасочванията за пълнота на всички случаи на разместване на съдържание.

Това са най-разпространените. Иначе има и "300" (multiple choices — сървърът дава списък с адреси и браузърът трябва да избере къде да отиде), "304" (not modified — указва, че обектът не се е променил и съответно браузърът може да реши да полза локално кешираното копие), "305" (use proxy — указва, че търсеният обект трябва да бъде достъпен през посредник, чийто адрес дава също в отговора), "307" (temporary redirect — вариация на "302", който прави практически същото).

Начин за настройка

Начините за указване на пренасочване са, общо взето, три — през сървъра, през програмния език или през крайния HTML-код.

Настройката през сървъра може да бъде направена или във файла за настройки или, ако нямате достъп до него (например ползвате виртуален хост на споделен хостинг) през файла .htaccess в съответната директория. Синтаксисът е следният:

за постоянно пренасочване
Redirect 301 /old-path.html  http://example.com/newpath.html
или
Redirect permanent /old-path.html  http://example.com/newpath.html
или
RedirectPermanent /old-path.html  http://example.com/newpath.html

за временно пренасочване
Redirect 302 /old-path.html  http://example.com/newpath.html
или
Redirect temp /old-path.html  http://example.com/newpath.html
или
RedirectTemp /old-path.html  http://example.com/newpath.html

Има и по-сложни комбинации с условното RedirectMatch, което приема като първи аргумент регулярен израз, с който можете да пренасочите наведнъж цяла група приличащи си адреси в сайта ви.

Пренасочването през програмния език представлява извикване на функцията в езика, която изпраща HTTP-заглавка към клиента, съдържаща код за пренасочване. Например ето как става за PHP:

за постоянно пренасочване
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://example.com/newpath.html");

за временно пренасочване
header("HTTP/1.1 302 Moved Temporarily");
header("Location: http://example.com/newpath.html");

и т.н. Важно е тези редове да се сложат най-отгоре, в началото веднага след "<php", защото заглавки трябва да се изпращат винаги преди съдържанието. И ако страницата ви даде някакво съдържание и чак след това заглавка, получава се грешка и търсеното пренасочване не става. Отново, ако не се спомене изрично кой е кодът, по подразбиране сървърът ще изпрати "302", временно пренасочване. Настройката за временно пренасочване е полезна, когато съдържанието наистина е на друго място само временно. Това подсказва индексиращите машини да продължават да следят стария адрес, но временно да насочват а съдържанието към новия. Ако обаче местите наистина за постоянно адреса, грешка е да се ползва 302 (което е по подразбиране) вместо правилното 301.

Пример с Perl през CGI:
#!/usr/bin/perl
print "Status: 301 Moved Permanently\nLocation: http://example.com/newpath.html\n\n";

или:
#!/usr/bin/perl
print "Status: 302 Moved Temporarily\nLocation: http://example.com/newpath.html\n\n";

При другите езици, когато се използват през CGI, нещата са подобни. Ако се използва някакъв фреймъурк, като Django или Rails, най-често има готови класове за пренасочване или за връщане на кратък отговор, в който изписваме като текст съобщението за пренасочване. Винаги важното е, че такива отговори трябва да се връщат към уеб-клиента преди всякакво друго съдържание. Общо взето, при пренасочванията всяко следващо съдържание не е важно и се пренебрегва, защото при правилно задаване на пренасочването клиентът вече се е обърнал към другия ресурс и слуша там.

Ако нямате достъп до горните начини или ако не искате да имате общо със сървърни настройки и езици за програмиране, лесно можете да вградите пренасочване в заглавната част на HTML-файл.

<meta http-equiv="refresh" content="0; url=http://example.com/newpage.html" />

Стойността на "content" е времето на изчакване преди пренасочването в секунди. 0 означава прехвърляне веднага на новия адрес. HTML-пренасочването е удобно за малки сайтове или отделни страници. За по-мащабни проекти най-добре използвайте описаните по-горе други начини.

Публикувано от turin

Излезе новата версия 0.5.0 на уеб-сървъра Cherokee. Това е малък и бърз уеб-сървър и е един от най-използваните подобни проекти. Наред с Thttpd, Boa, Lighttpd и максимално лекия и бърз (но само за статични страници) Dhttpd, Cherokee се радва на популярност там, където се търси бързо инсталиране, лесни настройки и няма нужда от безбройните модули на Apache.

Сървърът има поддръжка на лог-записи в съвместим с Apache формат, които лесно межете да използвате с инсталирани преди системи за анализ на трафика и броячи. Също така наред с поддръжката на CGI (FastCGI, SCGI, CGI) има и SSL/TLS за сигурни връзки, виртуални хостове, различни начини за идентификация (Htpasswd, Htdigest, Plain text, PAM) и компресиране на страниците с Gzip.

В мрежата има интересни сравнения между различни малки уеб-сървъри - статията в Уикипедия е изчерпателна, а тази в уики-то на самия проект Cherokee е по-малка, но прави добро впечатление, че авторът на Cherokee дава препратки към сайтовете на колегите си. Даването на такива препратки не е обща практика - явно някои мислят, че като крият съществуването на "конкуренцията" тя не съществува.

Интересен начин за спонсориране на проекта са премиите, които се дават от заинтересовата фирма за програмиране на определена функционалност. Досега с подкрепата на DynDns (доставчик на DNS-услуги, част от тях - безплатни поддомейни за общността) са внедрени поддръжка на FastCGI и управление на трафика. За съответно 700 и 500 долара. Ако някой се чувства уверен в уменията си, това е добър, интересен и приятен начин да се заработят добри пари. Особено за стандарта у нас.

В документацията на Cherokee има пример за инсталация на сървъра с Ruby on Rails. Малък сървър с лесночетима конфигурация, основни познания по Ruby и функционалната среда на Ruby on Rails - идеален начин за проектиране на уеб-сайтове. Без продължително настройване и донастройване на мастодонта Apache.

Не че Apache не е прекрасен продукт. Но понякога е добре уеб-сървърът да не се забелязва - нещо, което не се получава при Apache. Той си е забележителен. :)