Тонкости обработки ошибки 404

A
На сайте с 11.01.2003
Offline
26
1187

Добрый вечер!

Внимательно прочитал одну из тем форума, посвященную индексации динамических страниц. В частности, избавиться от наличия в ссылках URL`ей типа: www.mysite.ru/script.cgi?page=index&id=1 можно с помощью обработки ошибки 404, возникающей при попытке перехода на URL типа: www.mysite.ru/index/1

Я так и сделал: настроил поставил ErrorDocument для 404 в Apache на script.cgi, парамеры page и id извлекал из $ENV{REQUEST_URI}. Вся работает как надо за исключением одного момента.

В результате обращения к www.mysite.ru/index/1 в адресной строке браузера стоит именно www.mysite.ru/index/1, а хотелось бы, чтобы там стояло просто www.mysite.ru/index, т.к. параметр id=1 служит чисто для статистики и не стоит его отображать в URL пользователя. Во-первых, некрасиво, а во-вторых, вдруг человек захочет добавить страницу в избранное, а тогда, возникнут проблемы с корректностью статистики.

Можно ли как-то получить доступ к адресной строке браузера?

Заранее благодарен за ответы!

Cossack
На сайте с 17.12.2002
Offline
279
#1

url gripper - можно оставить только mysite.com или сделать редирект на index

Прощание славянки... (http://www.youtube.com/watch?v=0xf9lFMWfKw)
A
На сайте с 11.01.2003
Offline
26
#2

Что такое url gripper я не знаю:( А идея насчет редиректа приходила мне в голову, но тогда если сделать просто редирект на index - сервер зациклится, т.к. этот запрос также будет обратываться script.cgi. Можно правда сделать два скрипта, типа один смотрит есть ли параметры после index, если есть - обрабатывает и отрезает и редиректит на другой скрипт, который уже выдает страничку. Если подумать, можно, наверное, обойтись и одним скриптом, дабы он вызывал сам себя два раза, но и то и другое решение несколько кривовато.

Наверняка, как-то можно обмануть браузер, послать ему HTTP-ответ с подмененным URL, но так чтобы он не пошел по нему, а просто поместил в адресной строке. Я покопался в спецификации HTTP 1.1 там (в HTTP-ответе) есть два поля Location и Content-Location, вот только я не знаю, как с ними правильно работать из Perl/CGI, чтобы добиться требуемого результата.

[Удален]
#3
Наверняка, как-то можно обмануть браузер, послать ему HTTP-ответ с подмененным URL, но так чтобы он не пошел по нему, а просто поместил в адресной строке.

Нельзя.

Cossack
На сайте с 17.12.2002
Offline
279
#4
Что такое url gripper

Возможность спрятать или подменить url, оставив только mysite.com, например.

A
На сайте с 11.01.2003
Offline
26
#5

Цитата:

----------------------------------------------------------------------

Возможность спрятать или подменить url, оставив только mysite.com, например.

----------------------------------------------------------------------

Ясно, но, насколько я понял, URL Gripper - это фишка, которую предоставляет провайдер хостинга. Можно ли как-то сделать тоже самое самому средствами Perl и имея доступ к настройкам Apache?

Цитата:

----------------------------------------------------------------------

Нельзя.

----------------------------------------------------------------------

Алексей, следуя написанному в спецификации HTTP можно предложить такой вариант:

Послать ответ со статусом 201 (Created), а в Location поместить новый URL, тогда браузер должен отобразить этот новый URL. Но этот вариант у меня не сработал, хотя вроде бы все логично.

Кстати, не подскажете, как поисковые системы при индексации относятся к редиректам и махинациям со статусом?

LD
На сайте с 12.06.2002
Offline
71
#6
и имея доступ к настройкам Apache?

А чем Вас mod_rewrite не устраивает?

[Удален]
#7
Как писал Anty
Послать ответ со статусом 201 (Created), а в Location поместить новый URL, тогда браузер должен отобразить этот новый URL. Но этот вариант у меня не сработал, хотя вроде бы все логично.

Браузер отображает тот URL, с которого грузит страницу. Можно как-то играться с фреймами, яваскриптом и т. п., но с помощью ответов сервера можно добиться только редиректа.

Как писал Anty
Кстати, не подскажете, как поисковые системы при индексации относятся к редиректам и махинациям со статусом?

Нормально относятся. :) 200 - включение в базу, 301/2 - ставит в очередь новый адрес, 304 - по идее сохраняет имеющийся. В остальных случаях - убирает.

В результате обращения к www.mysite.ru/index/1 в адресной строке браузера стоит именно www.mysite.ru/index/1, а хотелось бы, чтобы там стояло просто www.mysite.ru/index, т.к. параметр id=1 служит чисто для статистики и не стоит его отображать в URL пользователя.

Если он стоит "чисто для статистики", то имеет смысл делать редирект на www.mysite.ru/index/, а наличие /1 в первом случае как раз и учитывать в этой самой статистике (писать в базу и т. п.). Естественно, разбирать запрашиваемый URL в скрипте-обработчике 404 надо аккуратно.

A
На сайте с 11.01.2003
Offline
26
#8
Как писал LakeDaemon

А чем Вас mod_rewrite не устраивает?

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

A
На сайте с 11.01.2003
Offline
26
#9

Большое спасибо всем за помощь!

Я сделал так, как советовал Алексей, вот только долго мучился с редиректом. Писал:

print "Status: HTTP/1.1 301\n";

print "Location: http://localhost/index\n\n";

Результат нулевой, не редиректится. Потом дотукал посмотреть заголовок отдаваемый сервером.

Оказалось, что Апач к моему статусу приписывал HTTP/1.1

Получалось:

HTTP/1.1 HTTP/1.1 301

...

Бэд рекуест и вся фигня.

Уж не знаю Апач странный (2.0.39) или руки у меня кривые.

Теперь пишу:

print "Status: 301\n";

print "Location: http://localhost/index\n\n";

И все работает

🍻

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий