Красносельский
Константин
Константинович

Компьютер и программы

Веб-дизайн

Справочники

Документация по CSS1

Настройка файла .htaccess

Коды ошибки http сервера

Подстановочные символы и регулярные выражения

Спецификация файла robots.txt

SSI – Server Side Includes

Таблица кодировки символов кириллицы

Нестандартные символы в HTML

Вторая таблица символов HTML

MIME Types (типы файлов)

 

Советы начинающим

Как в PHP поместить enum в массив

Советы начинающим Веб-дизайнерам: Что, где и зачем.

Правила плохого тона

WEB-уловки

Камень предкновения: верстка таблицами или блоками?

Рекомендации по разработке веб сайта

 

Анализ WEB-конъюнктуры. Создание лучшего сайта и его раскрутка.

Анализ WEB-конъюнктуры

Предисловие

Приручение поисковых машин

Уровень документа - все гениальное просто

Благоустройство нор для поисковых червей или как водить пауков по нашей паутине

Ускорение индексации сайта

Если гора не идет к Магомету

Индекс цитирования

Что это такое и с чем его едят

Приобретение веса в глазах общественности

Послесловие

Последние замечания по интернет-раскрутке

 

Приложения

А: «Рекомендации лучших пауководов»

Краткий комментарий.

Советы специалистов поисковой системы Rambler.

Использование файлов robots.txt.

Часто задаваемые вопросы.

Советы специалистов поисковой системы Aport.

Регистрация сайта в Апорте.

Советы специалистов поисковой системы Yandex.

Добавление страниц

Индексирование

Положение страницы на выдаче

Поиск со своей страницы

Ответы на часто задаваемые вопросы

 

Б: «1000 сверх-сайтов Рунета»

1000 сверх-сайтов Рунета

 

В: «Сто наиболее популярных поисковых слов»

Сто наиболее популярных поисковых слов

 

Г: «Где это сделать?»

Где это сделать?

 

Д: «Практическое руководство!!!»

Краткий комментарий.

Окна, ссылки и меню.

Ссылки и окна. Внешний вид и внутреннее содержание.

Организация ссылок. Всевозможные оглавления.

Если вам не нравятся фреймы, значит, вы не умеете их готовить.

Меню из выпадающих списков (javascript и CSS).

Многоуровневое раскрывающееся меню (javascript и CSS).

Работа с базами данных.

Обработка баз данных браузером посетителя

Обработка баз данных сервером (PHP)

Взаимодействие с посетителем

Отправка писем с веб-страницы.

Формы

Методы форм.

Создание на сайте PHP голосования.

Регистрация и контроль посетителей (PHP).

Интерактивность материала.

Создание гостевой книги на PHP.

Удаление записей из текстовых баз (PHP).

Заргузка файлов на сервер по HTTP-протоколу (PHP).

Разное.

Псевдослучайные элементы (PHP, javascript).

Точное определение имени и версии браузера с помощью JavaScript, SSI или PHP

Клоакинг и технология «Входных дверей».

Отложенное выполнение и выполнение с заданным интервалом (javascript)

Информация о размере, дате, собственные счетчики и протоколы посещений

 

 

 

Консультации

Экспорт и импорт новостей

PHP chmod – права доступа к файлам

WEB 2.0 – миф, или реальность?

Давно забытый AJAX

Способы хранения веб-страниц: документы FrontPage или базы данных

Как заработать на своем сайте?

FTP клиент, как настроить Total Commander

Знак собаки @ и подавление ошибок в PHP

AJAX

AJAX с точностью до наоборот, или как научить AJAX сохранять историю в браузере

 

Мониторинг веб сайтов и анализ поисковых запросов

Документация по Веб-дизайну

Желающим скачать PHP скрипт или JavaScript

 

Литература и поэзия

Гуманитарные науки

Мастерская

Хронология материалов

Обращение к посетителям

Скачать шрифты

Скачать рефераты

Создание web сайта на заказ

Создание веб сайтов (цены)

Веб-сайты, созданные мной (потенциальным заказчикам)

Полезные ссылки

Об авторе

Статистика сайта

 

Web На сайте

 

 

 

ТаблицейБлоками.

Приложение Д: учебник html, фрейм, JavaScript, SSI

Последняя модификация: 10.08.2014 г

Страница загружена с адреса: http://webdesign.site3k.ru/conjuncture/append/d/frames.html

Моя студия веб-дизайна

Если вам не нравятся фреймы (frames), значит, вы не умеете их готовить.

  1. Фреймы (frames). За и против. Что лучше, CGI, SSI или frame?
  2. Устранение недостатков frames
  3. Советы, для гурманов

Лирическое отступление.

В принципе, я не буду рассказывать, как готовить фреймы. Об этом рассказано в документации по HTML 4.0, ссылки которую есть на странице Советы начинающим веб-мастерам. Эту документацию следует изучить самостоятельно. А я расскажу о преимуществах фреймов и предъявлю доказательства того, что все легенды об их недостатках порождены отсутствием таланта у некоторых программистов.

Что вы так встрепенулись? Я не утверждаю что, вы плохой программист, если не умеете сделать из фреймов конфетку. Я хочу лишь сказать что, есть НЕ программисты, плохие программисты, хорошие программисты и талантливые программисты. И если вы без моей помощи не можете разобраться с фреймами, значит, к талантливым вы не относитесь. Кто-то скажет что, на самом деле ему не хватает опыта, что он только начал и еще многого не понял…

А я когда начал? В эпоху динозавров? Однако, когда передо мной стоит задача, она передо мной уже не стоит.

Кто-то скажет, что он не знает английский, а вся документация на английском…

А вот и не вся. Посмотри на моем сайте или купи в магазине. Конечно, как правило, документация либо просто коряво переведена, либо изначально коряво написана, касается только отдельных аспектов или вообще, непонятно зачем создана... Но разве это можно сказать о той документации, которую переводил я? Или о той, которую я сам составлял? Если я еще оставил что-то не исследованным, то только потому, что еще не дошли руки, но акция по ликвидации безграмотности продолжается, и, вполне возможно, ответ на свой вопрос, ты получишь уже завтра.

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

Но хватит полемики. Талант, о котором я говорил, он либо есть, либо его нет. Ему не поможет ни опыт, ни везение, ни что-то еще. Если у тебя нет таланта, то это не значит, что из тебя не выйдет хорошего программиста. Лучший не выйдет, это верно, но, сколько их, лучших? Пять, десять? А остальные просто хорошие, так что, все в порядке. Главное не то, будешь ли ты лучшим или просто хорошим, а тем более не то, есть ли у тебя талант, или нет. Я знаю талантливых людей, которые хиреют в нищете, а история знала их еще больше. Ты ведь не хочешь жить так? Тебе главное что? Дача на Канарах, личная яхта, лимузин, положительные отзывы в средствах массовой информации… Правильно? Талант для этого не нужен, так что, будь спокоен. И пойми, имел бы ты талант, именно прелести жизни, тебя бы и не волновали. И жена бы от тебя ушла, обвинив в том, что ты постоянно чем-то занят (или муж выгнал за постоянный беспорядок в доме). Так что, это даже хорошо, что талантов мало, иначе люди были бы одиноки. Плохо лишь то, что многим из них так и не удается вырваться из рутины бытия и заняться настоящим делом.

А мы, вот, займемся.

Фреймы (frames). За и против. Что лучше, CGI, SSI или frame?

Преимущества фреймов (frames).

Если меню вписывать в каждую страницу, то это лишний текст, лишний объем, лишнее время загрузки и переделка всего сайта, при необходимости включить новый пункт. Если меню включается по SSI, то переделывать весь сайт для добавления меню не требуется, сокращается объем страниц... Но не время загрузки! Так как, сервер выдает обозревателю (агенту пользователя, как его любят называть разработчики спецификаций по HTML), файл с приклеенным к нему меню и, соответственно, с увеличенным объемом. К тому же, это дополнительная загрузка сервера, которому приходится, помимо всего прочего, редактировать выдаваемый файл. Если речь об одном посетителе (вообще на сервере) – разговора нет, но если десяток тысяч, да всем требуется приклеивать меню, то замедление работы сервера должно быть ощутимым. А в случае с фреймами, меню один раз загрузилось, а дальше выдаются только маленькие файлы текста – минимум трафика, минимум загрузки процессора не сервере, максимум скорости.

Возражений нет?

Кроме того, посмотрите какие на самом деле мелкие страницы на большинстве сайтов. Один – два абзаца, и вся страница. Остальное – баннеры, таблицы для формирования приличного вида после CGI-приклеивания и небольшое меню. А почему? Отчасти, чтобы заставить вас пощелкать по ссылкам и заработать для сайта баннерные показы, а отчасти и для того, чтоб вы не теряли из вида меню, уезжающее вверх, вместе с листаемым текстом. Чем меньше текста, тем меньше уедет меню. Можно, конечно, заставить его опускаться, по мере перемещения текста, но это ведь дополнительные трудности да, к тому же, такое, скачущее, меню и надоесть может.

Недостатки фреймов (frames).

Попытаюсь перечислить все мнимые недостатки фреймов. Поскольку я сам смотрю на фреймы положительно, то не гарантирую что, перечислю весь перечень их «недостатков», но, надеюсь, что главные, перечислю все.

  1. Если посетитель идет сразу на одну из страниц сайта, не являющуюся главной, то теряется возможность навигации.
  2. Фреймы плохо индексируются поисковыми машинами.
  3. Фреймы не видны тем, кто использует текстовые браузеры или старые графические браузеры, не поддерживающие фреймов.
  4. На страницу внутри фрейма нельзя поставить закладку, так как фреймы скрывают ее адрес.

Надеюсь все.

Устранение недостатков frames

Если влез, неведомо куда.

Теперь избавимся от заблуждений, в том же порядке, в котором перечислили. Попав на страницу, не являющуюся главной, пользователь остается без навигации… А че его туда понесло?

Но, будем серьезны. Несмотря на то, что дизайнеры желают, чтобы навигация начиналась с главной страницы, пользователь может запомнить адрес заинтересовавшего его раздела и в следующий раз полезть к нему, введя адрес в командную строку – вполне разумное поведение. Кроме того, на другом сайте, может быть ссылка на внутренний раздел вашего сайта, бросающая ничего не подозревающего пользователя прямо в самые дебри. Это тоже разумно. Представьте себе, что на странице, пятого уровня вложенности, у вас бесплатная раздача слонов. Прознав про это, я пишу на своей странице: «Желающие обзавестись слонами, могут бесплатно заполучить их по адресу…» и дальше адрес той самой страницы, пятого уровня вложенности. Не бросать же мне его на ваш титульный лист, как на амбразуру дзота, чтобы, помыкавшись, туда-сюда и ничего не найдя, он думал, что я его обманул. А так, я его прямехонько, к самым слонам. Если же из всей навигации у него будет только кнопка «Назад» в браузере, возвращающая на мой сайт, то это не мои – это ваши проблемы. Правильно? Вот вы и боитесь фреймов.

Не бойтесь, они не кусаются.

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


<SCRIPT LANGUAGE="JavaScript"><!-- 
if (self.parent.frames.length == 0) document.writeln("<H2>Здесь вы получите <A HREF=\"index.html\">
<font color=blue>удобную навигацию</font></A></h2>");  //
 --> </SCRIPT>

Где зеленый текст должен остаться без изменений, красный должен указывать на вашу главную страницу, остальное – на ваше усмотрение. Но текст должен быть броским. Условие if (self.parent.frames.length == 0), в данном примере, проверяет, открыт ли документ внутри фрейма, или нет, и если нет, добавляет в него указанный в document.writeln текст.

Тогда пользователь сможет сам перейти к главной странице.

Но это знают многие.

Не менее разумно в конце страницы вставить такой код:

<P>&nbsp;
<HR>
<Center><a href="http://webdesign.site3k.ru"  target=_top title="Если вы оказались здесь не по ссылке сайта
 http://webdesign.site3k.ru">На главную страницу сайта </a></Center>
<P>

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


<SCRIPT LANGUAGE="JavaScript"> <!-- 
if (self.parent.frames.length == 0) 
 self.parent.location="index.html"; 
// --> </SCRIPT>

Но это жестоко. Пользователь так никогда и не узнает, где его слоны.

А слабо вам открыть главную страницу, не отбирая у пользователя его слонов? (я заметил, что вместо слова «посетитель», часто использую «пользователь», вы уж меня простите, в Интернете я с конца августа 2003 года и еще не привык, основная же моя работа – следить за пользователями и писать для пользователей программы, а так же, обучать пользователей работе на компьютере).

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

Решить эту задачу можно многими способами. Меня интересовал тот, который обходится без серверной поддержки и полностью работоспособен на машинах, отключенных от Интернет (если файлы закачаны и просматриваются локально). Естественно, этот способ должен работать в любом браузере, поддерживающем скрипты и, ВизуалБейсик, по этой причине, отпадает. Остается только ЯваСкрипт. И, если вышеприведенный код переброски слегка откорректировать, добавив к имени главного файла знак вопроса и относительный путь перебрасывающего файла, вместе с именем (в примере, файл лежит в том же каталоге, и относительного пути нет), открываемая главная страница будет знать, что пользователь хотел получить.


<SCRIPT LANGUAGE="JavaScript"> <!-- 
if (self.parent.frames.length == 0) 
 self.parent.location="redir.html?slony.html"; 
// --> </SCRIPT>

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

<html lang="ru">
<SCRIPT LANGUAGE="JavaScript"> <!-- 
document.write('<frameset  frameborder=1 bordercolor=maroon cols="25%,1*">');
document.write('<frame name=Frame1 src=LeftFram.html>');
B=document.location.search
if (B == "")
  document.write('<frame name=Frame2 src=RightFrm.html>');
else
  document.write('<frame name=Frame2 src=' + B.substring(1) + '>');
document.write('</frameset>');
// --> </SCRIPT>
</html>

Красное – это имена рамок, открываемых по умолчанию. Если посетитель пришел прямо на главную страницу, все остается, как было, с той только разницей, что страница пишется динамически. Если же его перебросило ссылкой типа redir.html?slony.html, функция document.location.search вычленит из нее имя перебросившего файла и знак вопроса и поместит это в переменную B. Дальше идет проверка условия. Если переменная пустая (переход произошел без переброски), открывается правая рамка, если переменная не пустая из нее берется остаток строки, после первого символа (функция B.substring(1)) и подставляется вместо имени правого фрейма. В результате, там открывается документ, совершивший переброску.

Первого недостатка больше нет?

В компонентах фрейма, добавлять ?LeftFram.html к index.html не требуется. Код переброски основных страниц фрейма должен выглядеть стандартно:


<SCRIPT LANGUAGE="JavaScript"> <!-- 
if (self.parent.frames.length == 0) 
 self.parent.location="index.html"; 
// --> </SCRIPT>

Его незачем усложнять.

Рецепт против плохой индексации frames.

Во-первых, информация о плохой индексации давно устарела. Как я уже не раз заявлял, это было тогда, когда фреймы только появились. Но неужели вы думаете, что разработкой поисковых роботов занимается армейский генералитет? Некоторые программисты, смею заметить, не такие дубовые. Вот, например, что по этому поводу сообщил Рамблер: «Роботы Rambler прекрасно справляются с конструкциями фреймов, однако наличие лишнего этажа ссылок (от головного навигационного фрейма к "содержательным") замедляет индексацию». Насколько? Ровно настолько, насколько требуется для перехода от одного уровня, к другому. А это зависит от величины уровня. Учитывая что, первый уровень, в этом случае состоит из одного файла, для перехода достаточно минуты. Но можно исключить и ее. Желательно исключить. Ведь какой-то поисковик, действительно может быть дубовым (тяжело представить, но, чем черт не шутит?).

Для исключения проволочек с индексацией, после определения фреймов, перед тегом </frameset>, следует записать:

<noframes>
<body>

И в это тело включить ссылки на все страницы второго уровня вложенности (те, на которые указывает рамка оглавления). Робот прочтет их и, проиндексирует одновременно с рамками фрейма (подробности смотрите в документации по HTML 4.0 и других материалах сайта).

Во-вторых, кто запретит поместить туда ссылки на файлы третьего, четвертого… тысячного уровня? И это будет самый быстроиндексируемый сайт.

И что же по вашему лучше индексируется, после всего сказанного?

Браузеры без фреймов (frames).

Это тяжелый случай. Но «у нас с собой было…». В те же <noframes> и <body> помещаем следующий код:

<P>This page uses frames, but your browser doesn't support them.
<P>Заведите себе нормальный браузер, который может смотреть фреймы.

Чтобы посетитель понял – он сам себя обкрадывает. А возможность все-таки увидеть содержимое сайта, дадут ему ссылки, оставленные для роботов. По уже упомянутым ссылкам перехода на главную страницу, он, если потребуется, вернется к оглавлению. Кто не верит, может проверить. Сомневаюсь, что хотя бы 10% посетителей Интернет имели браузеры не работающие с фреймами. Но, для того, чтобы вы могли проверить, подскажу: Windows (Total) Commander 5.5 имеет встроенный текстовой браузер. Отметьте в нем главную страницу фрейма с гиперссылками внутри «нофреймов», нажмите F3 и спокойно погуляйте по страницам. Работает?

Еще вопросы есть?

Закладки на страницу внутри фрейма (frames).

То, что на страницу внутри фрейма нельзя поставить закладку – это самая большая нелепость о которой мне приходилось слышать. Каким-то образом человек попадает на страницу? Я подозреваю, что он попадает туда по ссылке. Когда мышь оказывается на ссылке, в строке состояния отображается адрес ссылки и посетитель знает, куда отправится. Если же щелкнуть по ссылке правой кнопкой, то из появляющегося контекстного меню можно выбрать пункт «Скопировать адрес ссылки» и затем вставить его, куда угодно. Можно помочь посетителю, указав в самой странице ее адрес (например, командой «document.writeln("<P>Адрес: " +document.location)») или вписав функцию добавления страницы в закладки. Но, по большому счету, такая помощь нужна только посетителям, страдающим слабоумием.

Советы, для гурманов.

  1. Если вы используете фреймы, следите за тем, чтобы ваши ссылки на внешние ресурсы имели параметр target=_top, если вы хотите, чтобы посетитель, открывая предложенный ему ресурс, покинул ваш сайт или target=_blank, если вы не хотите, чтобы он его покидал. Не пытайтесь заставить чужие сайты открываться внутри фреймов. Многие из них окажутся неудобными, внутри ваших рамок. Кроме того, некоторые злые дизайнеры этого не любят и ставят в свои страницы такой код:
    <SCRIPT LANGUAGE="JavaScript"> <!--
    if (self.parent.frames.length != 0)     self.parent.location=document.location;
    // --> </SCRIPT>
    
    Этот код сбрасывает фреймы, позволяя их странице нормально открыться, и пользователь покидает ваш сайт.
  2. Предложенный главный файл фреймов лучше не делать настоящим входным файлом сайта. Динамическое формирование фреймов – вещь полезная, но статический HTML надежней. Поэтому пусть ваш входной index.html содержит нормальные теги, а файл, используемый для переназначения, лучше положить в придачу к нему. Только учтите что, некоторые сервера запрограммированы на периодическую чистку содержимого и выбрасывают все, на что нельзя перейти по ссылкам. Скрипт self.parent.location="redir.html?slony.html" не является ссылкой и положенный в дополнение к основному входному файлу, файл переброски окажется под угрозой. Чтобы он наверняка не был выброшен, поставьте на любой из страниц на него нормальную ссылку.
  3. Во избежание потери фрагментов рамок, при открытии страницы, находящейся в другом каталоге, следует указывать абсолютный путь в файле переназначения.
  4. Вместо
    if (self.parent.frames.length != 0)     self.parent.location=document.location;
    
    можно вставить
    if (self.parent.location !='file://localhost/C:/1111/index.html' && self.parent.location
     !='file://localhost/C:/1111/test.html?ibmpc.html') self.parent.location="test.html?ibmpc.html"; 
    
    Такой код проверяет не наличие рамки вообще (ведь это может оказаться и чужая рамка), а именно вашей рамки.
  5. Указанные способы переадресации хороши для сайта. Тех же, кто, сохранит отдельную страницу локально, ждет сюрприз: Обнаруживая отсутствие фреймов, страница будет перебрасывать посетителя на НЕ сохраненную им страницу, создающую фреймы и, если он не достаточно знаком со скриптами, чтобы найти и устранить причину переброски, то он не сможет ее просмотреть.
    Этой ситуации можно избежать тремя способами. Во-первых, можно сделать версию, предназначенную для локального просмотра и поместить ее в архиве, во-вторых, можно перед командой переброски вставить проверку адреса:
    if (window.location.host !="" && window.location.host !="localhost")
    
    (вторая часть нужна для Оперы, выдающей при локальном расположении файла строку «localhost»), и посетитель не будет переброшен при локальном хосте.
    В третьих, перадресацию можно заменить вызовом функции из другого файла:
    <SCRIPT LANGUAGE="JavaScript" src="readres.js"></SCRIPT>
    <SCRIPT LANGUAGE="JavaScript">
    if (self.parent.frames.length == 0) refunction("MyFile.html");
    </SCRIPT>
    
    А в этом файле (readres.js) написать функцию переадресации:
    function refunction(path) {self.parent.location="redir?" + path }
    
    Тогда переадресация не произойдет, если сохранена только конкретная страница, независимо от строк возврящаемых обозревателем при запросе хоста.

    Можно совмещать сразу все способы:
    <SCRIPT LANGUAGE="JavaScript" src="readres.js"></SCRIPT>
    <SCRIPT LANGUAGE="JavaScript">
    if (window.location.host !="" && window.location.host !="localhost") if (self.parent.frames.length == 0)
     refunction("MyFile.html");
    </SCRIPT>
    
    Или
    <SCRIPT LANGUAGE="JavaScript" src="readres.js"></SCRIPT>
    <SCRIPT LANGUAGE="JavaScript">
    if (window.location.host !="" && window.location.host !="localhost" && self.parent.frames.length == 0)
     refunction("MyFile.html");
    </SCRIPT>
    
    Это даст большую увереность в качестве результата.
  6. Вместо создания специального файла переадресации, код переадресации можно включить в главную страницу фреймов (Index.html):
    <html lang="ru">
    <head>
    <SCRIPT LANGUAGE="JavaScript"> <!-- 
     function JS() {
    B=document.location.search
    if (B != "")
      parent.Frame3.location=B.substring(1) ;
    }// --> </SCRIPT>
    </head>
    
     <frameset  frameborder=1 bordercolor=maroon cols="25%,1*" OnLoad = JS() >
      <frame name=Frame2 src=LeftTram.html>
      <frame name=Frame3 src=RightFrm.html>
      <noframes>
      <body>
      <p>This page uses frames, but your browser doesn't support them.
      <P>  Заведите себе нормальный браузер, который может смотреть фреймы.
      </body>
      </noframes>
     </frameset>
    
    </html>
    
    Встроив вызов функции переадресации (здесь JS) во внутрь <frameset>: С виду компактней, да и специальный файл создавать не требуется. Но загрузка нужного файла замедлится, так как начнется только после загрузки стандартного правого фрейма.
  7. Для поддерживающих SSI-директивы серверов можно упростить работу и вместо того, чтобы писать в коде переброски на каждой странице ее имя, путь и домен, в страницу можно вписывать только SSI-инструкцию <!--#include virtual="/_redir.shtml" --> (см.  документацию по SSI-директивам). А в файл _redir.shtml, расположенный в корне сайта включить следующий код (комментарии можно удалить):
    <SCRIPT LANGUAGE="JavaScript"><!--
    try {
        a=self.parent.location; // при открытии во фрейме другого сайта,
                                // эта срока может не сработать и
                                // (дальнейшее выполнение скрипта прервалось бы,
                                // если бы не оператор try),
                                // а если сработало, переменная содержит адрес текущей страницы фреймов
        b=self.parent.frames.length;// вложенность фреймов. Если 0 - открывают напрямую
    } catch (e) {
    	a='';               // если все-таки не работает
    	b=0;
    }
    
    if ((a.indexOf('http://<!--#echo var="HTTP_HOST" -->') < 0
       && window.location.host !="" && window.location.host
       !="localhost") || (b==0 && window.location.host !=""
       && window.location.host !="localhost"))
        // если текущая страница фреймов не наша (не содержит наше доменное имя),
        // и это не локальный просмотр, или фреймов вообще нет, и это не локальный просмотр
        self.parent.location=
        'http://<!--#echo var="HTTP_HOST" -->/index.html?<!--#echo var="DOCUMENT_URI"-->';
    // --> </SCRIPT>
    
    Тогда, независимо от перемещения страницы внутри сайта или смены доменного имени, в страницу будет внесен ее точный адрес, благодаря SSI-переменным.
  8. Используя SSI, можно пойти и дальше: не доверять клиентским скриптам, которые могут оказаться отключены, а решать все на сервере, анализируя переменную HTTP_REFERER. Если она пустая или не начинается с нашего домена, значит, на страницу пришли со стороны и, если это не индексный файл, содержащий определение фреймов, ее необходимо погрузить во фрейм, чтобы она не лишилась панели навигации.
    Общая схема страницы при этом приобретает следующий вид:
    <!-- если реферер не начинается с нашего домена -->
    <!--#if expr="$HTTP_REFERER != /^http:\/\/${HTTP_HOST}/" -->
    <!-- Включить фреймы -->
    <!--#include virtual="/index.html?${DOCUMENT_URI}" -->
    <!--#else -->
    <!-- Содержимое файла -->
    <!--#endif -->
    
    <!-- index.html -->
    
     <frameset frameborder=1 bordercolor=Teal cols="25%,1*">
      <frame name=Frame2 src=/menu.html>
      <frame name=Frame3 src=<!--#if expr="$QUERY_STRING" --><!--#echo var="QUERY_STRING" -->
      <!--#else -->/default.html<!--#endif -->>
     </frameset>
    
    Вопрос лишь в том, как понравится поисковикам, что каждую страницу, они будут находить пустой (у них то реферер не будет содержать нашего домена)?
    Поэтому, вместо включения фрейма инструкцией
    <!--#include virtual="/index.html?${DOCUMENT_URI}" -->
    
    Можно сделать так, чтобы каждая страница была сама себе фреймом, для чего вместо
    <!--#include virtual="/index.html?${DOCUMENT_URI}" -->
    
    Прописать:
     <frameset frameborder=1 bordercolor=Teal cols="25%,1*">
      <frame name=Frame2 src=/menu.html>
      <frame name=Frame3 src=<!--#echo var="DOCUMENT_URI" -->>
     </frameset>
    
    Такой вариант позволяет показать поисковым системам содержание страницы внутри <noframes>.
    Полный текст получается таким:
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <title></title>
    <META name="keywords" content="">
    <META name="description" content="">
    </head>
    
    <!--#if expr="$HTTP_REFERER != /^http:\/\/${HTTP_HOST}/" -->
    
     <frameset frameborder=1 bordercolor=Teal cols="25%,1*">
      <frame name=Frame2 src=/menu.html>
      <frame name=Frame3 src=
      <!--#echo var="DOCUMENT_URI" -->?a=<!--#config timefmt="%s" --><!--#echo var="LAST_MODIFIED" -->>
     <noframes>
    
    <!--#endif -->
    
    <!-- Содержимое файла -->
     <body>
    <h1>Пример способов борьбы с фреймами и способов их защиты</h1>
    <P>Способ, если страница вызвана без фрейма, автоматически вставить ее во фрейм,
    без использования клиентских скриптов.
    <P>Здесь используется SSI.
    <P>Значение HTTP_REFERER=<!--#echo var="HTTP_REFERER" -->
    
    
     </body>
    
    <!--#if expr="$HTTP_REFERER != /^http:\/\/${HTTP_HOST}/" -->
     </noframes>
     </frameset>
    <!--#endif -->
    <html>
    

    Генерация случайного параметра в

    <frame name=Frame3 src=<!--#echo var="DOCUMENT_URI" -->?a=<!--#config timefmt="%s" --><!--#echo var="LAST_MODIFIED" -->>

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

    Предлагаю 4 примера для проверки:
    Страница, находящаяся в этом домене, открывающаяся внутри этого фрейма Смотреть (откроется, как любая другая).
    Эта же страница, открывающаяся в новом окне Смотреть (поскольку запрос с того же сайта, страница откроется без фреймов).
    Такая же страница, находящаяся в другом домене, открывающаяся внутри этого фрейма Смотреть (откроется в собственных фреймах внутри этого).
    Она же, открывающаяся в новом окне Смотреть (откроется в собственных фреймах).

    Наверняка вам будет интересно посмотреть исходный код и адреса страниц описывающих фреймы и страниц, отображающих текст. Обратите внимание: адрес у них один.

    Выбор метода: JavaScript или SSI – дело вкуса и их особенностей. Поскольку во втором примере применения SSI страница открывается без фреймов, а в третьем, новые фреймы открываются внутри чужих, наиболее гарантированную защиту дает совмещение обоих способов: SSI используется для максимальной гарантии что, даже если отключен JavaScript, страница откроется во фреймах; JavaScript используется для того чтобы, если SSI бессилен (второй и третий пример), а JavaScript у посетителя не выключен, все-таки переместить страницу во фреймы. Но такой фанатизм вовсе не обязателен – можно обойтись одним способом. К тому же, в варианте с SSI, использующем единый файл, текст в <noframes>, оставленный для поисковиков, закачается дважды: один раз как <noframes> в странице-содержателе фрейма, а второй раз: как обычный текст, обычной страницы, включенной в этот фрейм, тем самым, удваивая трафик и время загрузки. Фреймы потеряют компактность – свое главное достоинство и превратятся в обузу. В варианте с SSI, использующем два различных файла: один содержащий описание фреймов, а другой, текст страницы, возникают проблемы с индексацией поисковыми роботами. В результате, идея чистого SSI вовсе не так хороша, как могло показаться. Но, зная ее достоинства и недостатки, вы в праве выбирать (конечно, вместо SSI можно применить такие языки как PHP, Perl, C... но все это будет сдалано по аналогии с SSI и такие варианты незачем перечислять).
    Лично я выбрал JavaScript.

    Можно сделать так, чтобы в варианте с SSI, содержащим и текст страницы, и описание фреймов, <noframes> загружались только поисковыми роботами, но это уже область  клоачных скриптов.

  9. Еще один принципиальный способ перенаправления посетителей на страницу с определением фреймов заключается в использовании команд модуля mod_rewrite и файла  .htaccess. Для чего в файл .htaccess прописываем правила преобразования:
    # Включить преобразование адресов
    RewriteEngine on
    # Если запрошен не корень сайта (возможно с названием корневого индекса и заключительным слешем)
    # и не корень с обязательным вопросительным знаком и QUERY_STRING
    # и запрос поступил не с сайта webdesign.site3k.ru
    RewriteCond %{REQUEST_URI} !^/(index\.html)?/?$ [NC]
    RewriteCond %{REQUEST_URI} !^/(index\.html)?/?\?.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(www\.)?webdesign\.site3k\.net.*$ [NC]
    RewriteRule ^.*$ /?%{REQUEST_URI} [NS,R]
    
    Означающие что, любой внешний запрос (страница-отправитель не начинается с http://webdesign.site3k.ru или http://www.webdesign.site3k.ru) следует интерпритировать как запрос к корню сайта (http://webdesign.site3k.ru/) и, добавлять к нему вопросительный знак и весь исходный запрос. Таким образом, запрос страницы, например
    http://webdesign.site3k.ru/docs/robots_txt.html
    
    Полученный не с одного из фреймов сайта webdesign.site3k.ru, превратится в
    http://webdesign.site3k.ru/?/docs/robots_txt.html
    
    Индексная страница http://webdesign.site3k.ru/ получит изначально запрашиваемый адрес в качестве QUERY_STRING, а находящейся на ней (SSI, JavaScript или PHP) скрипт определит, как с ним поступать.

 

Комментарии к странице (всего 15)

 

 

 


На главную страницу сайта