Записать реферер с помощью htaccess

Bu-Bu

Любитель PHP
Записать реферер с помощью htaccess

Столкнулся с такой задачей. Откуда-то приходят рефереры с неправильным адресом, вызывающим ошибку 404. Потом эта ошибка благополучно всплывает на поисковиках, что не есть хорошо. Как отловить эти рефереры (может это такой новый способ атаки на успешный сайт) с помощью htaccess, т.к. сервер естественно выкидывает посетителя на страницу 404? Можно
это сделать без использования общего файла-обработчика, а только при ошибке? Всем спасибо за подсказку!
 

dimagolov

Новичок
что-то у меня подозрение, что ты не возвращаешь статус 404 в реале. потому что поисковики никак не будут индексировать страницы с кодом 404, они их будут выкидывать из базы.
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
что-то у меня подозрение, что ты не возвращаешь статус 404 в реале. потому что поисковики никак не будут индексировать страницы с кодом 404, они их будут выкидывать из базы.
У меня есть редирект на собственную страницу 404, однако рефереры туда приходят пустые. Задача отловить их на уровне htaccess, но чего-то готового решения пока не нашел, а перечитывать весь htaccess некогда
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
вот тут ты и лажанулся. надо не редиректить, а возвращать эту страницу с кодом 404.
Сайт сделан для посетителей а не для поисковиков. Поэтому страница 404 сделана для сохранения посетителя на сайте. А задача отловить левые рефереры и убить кривые ссылки, которые возможно находятся в каких-нибудь мусоросборниках типа линкаторов.

P.S. Страница вызывается через ErrorDocument 404
 

dimagolov

Новичок
Bu-Bu, ты определись, то ли у тебя redirect, то ли ErrorDocument.
хотя мне, как и поисковику, фиолетово, что ты там у себя намудрил, посковик если получает статас 404, то не катологизирует ссылку. если они у тебя все равно в поисковиках, значит стату был никак не 404.

ты собираешься убирать ссылки на чужих ресурсах?

по теме - настрой лог апача на логирование реферера и будет тебе щастье
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
Bu-Bu, ты определись, то ли у тебя redirect, то ли ErrorDocument.
хотя мне, как и поисковику, фиолетово, что ты там у себя намудрил, посковик если получает статас 404, то не катологизирует ссылку. если они у тебя все равно в поисковиках, значит стату был никак не 404.

ты собираешься убирать ссылки на чужих ресурсах?

по теме - настрой лог апача на логирование реферера и будет тебе щастье
А кто мне даст логи апача настраивать? Хостеру это не нужно. Поисковик приходит по ссылке http://site.ru/всякахрень с какой-то левой ссылки. Если я буду знать рефереры, то смогу их обрабатывать и на каждую всякухрень могу отдавать соответствующую страницу. За день накапливается до 20 левых заходов и все они с поисковиков - слишком большой траффик для сайта моей тематики, чтобы им пренебрегать.
 

dimagolov

Новичок
Bu-Bu, ты разберись, это поисковики проверяют ссылки, или клиенты находят их в поисковиках.

если нету логов апача, то все, что надо сделать, это перенаправлять (mod_rewrite, а то ты опять redirect начнешь делать) такие запросы на скрипт и анализировать заголовки скриптом.
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
Bu-Bu, ты разберись, это поисковики проверяют ссылки, или клиенты находят их в поисковиках.

если нету логов апача, то все, что надо сделать, это перенаправлять (mod_rewrite, а то ты опять redirect начнешь делать) такие запросы на скрипт и анализировать заголовки скриптом.
mod_rewrite? Весь траффик запускать через него? Что-то я не слышал, чтобы mod_rewrite реагировал на отсутствие файла на сервере? У меня страниц примерно 1500
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
Bu-Bu, изучем http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond, все он умеет
Слушай, кончай умничать! Найди мне директиву для rewritecond, которая обнаруживает ошибку 404. Если я еще не совсем дурак, то это должно быть типа SERVER_STATUS. В списке она отсутствует.

HTTP headers: connection & request:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals: date and time: specials:
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
 

dimagolov

Новичок
2. There are some special variants of CondPatterns. Instead of real regular expression strings you can also use one of the following:
* '-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
* '-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.
* '-s' (is regular file, with size)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file with size greater than zero.
* '-l' (is symbolic link)
Treats the TestString as a pathname and tests whether or not it exists, and is a symbolic link.
* '-x' (has executable permissions)
Treats the TestString as a pathname and tests whether or not it exists, and has executable permissions. These permissions are determined according to the underlying OS.
* '-F' (is existing file, via subrequest)
Checks whether or not TestString is a valid file, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance!
* '-U' (is existing URL, via subrequest)
Checks whether or not TestString is a valid URL, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance!

Note:
All of these tests can also be prefixed by an exclamation mark ('!') to negate their meaning.
 

Bu-Bu

Любитель PHP
Намекаешь на что-то типа этого что ли?

RewriteCond %{REQUEST_URI} !F
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
Bu-Bu, а попробовать самому слабо?
Я понять не могу: чего мы в этот mod_rewrite ударились. Насколько я помню для rewritecond нужно прописать строку, которую он должен поймать, если просто написать ^$, то куда тогда пристроить ! ?Кстати mod_rewrite пользую уже несколько лет и знаю его лучше других, однако твоя мысль мне непонятна, вот и обоснуй.
 

dimagolov

Новичок
что тебе обосновывать? тебе надо отловить запросы, которые "левые", причем на уровне apache, и отправить их на скрипт-анализатор. как ты это реализуешь?
RewriteCond ты уже написал. воспользуйся им и проверь, будет он ловить несуществующие файлы, или нет.
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
что тебе обосновывать? тебе надо отловить запросы, которые "левые", причем на уровне apache, и отправить их на скрипт-анализатор. как ты это реализуешь?
RewriteCond ты уже написал. воспользуйся им и проверь, будет он ловить несуществующие файлы, или нет.
Конечно не будет, потому что нужна строка для обработки с которой rewritecond ее будет сравнивать, поэтому и предлагаю тебе блеснуть эрудицией и показать: зачем ты предложил mod_rewrite. А иначе получается, что просто чушь сморозил и в кусты.
 

dimagolov

Новичок
не знаешь как через mod_rewrite делать, то что тебе мешает то же самое сделать через ErrorDocument?
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
не знаешь как через mod_rewrite делать, то что тебе мешает то же самое сделать через ErrorDocument?
Да уж, не знаю. Потому что такого решения нет, а ErrorDocument не передает реферер - пустая строка.
 

dimagolov

Новичок
Да уж, не знаю. Потому что такого решения нет
подумай головой, для разнообазия :)
тебе все, что надо, это собрать полный путь к файлу для ключика -f (вернее для его отрицания) в RewriteCond. раз ты большой знаток mod_rewrite, то склеить для этого аж две переменные сможешь?
 
Сверху