.htaccess, как изменить внутренний редирект на внешний без ошибок?

T
На сайте с 23.11.2005
Offline
298
1915

Вот такой внутренний редирект

RewriteCond %{REQUEST_URI} jpg$

RewriteRule ^(.*)jpg$ $1php [L]

при попытке открыть некий sample.jpg файл, открывает sample.php файл.

Попробуйте

http://indiatourism.ws/goa/patnem_beach/1.jpg

http://indiatourism.ws/goa/patnem_beach/2.jpg

http://indiatourism.ws/goa/patnem_beach/3.jpg и т.д.

Реально будет открываться оболочка

http://indiatourism.ws/goa/patnem_beach/1.php

http://indiatourism.ws/goa/patnem_beach/2.php

http://indiatourism.ws/goa/patnem_beach/3.php и т.д.

Т.е. всё как-бы красиво. Но вот незадача. В самом браузере открыта-то да, php страница, цель достигнута, но...

1. В строке браузера прописан адрес с jpg.

2. В логах отображается тоже страница с урлом jpg, что смущает, например, код 200 не должен быть на выдачу jpg, ведь реально jpg не отдаётся, и в логах я понимаю, что под jpg имеется ввиду php, на который код 200 - это правильно.

Пробую изменить .htaccess так, на внешний редирект:

RewriteCond %{REQUEST_URI} jpg$

RewriteRule ^(.*)jpg$ $1php [R=301,L]

Если так делать, то да, откроется именно php страница, но на ней, пока не нажмёшь F5, никак не будет загружен jpg.

Поэтому вопрос, как сделать именно внешний редирект, и чтобы картинка jpg была видна сразу, без F5. Ведь F5 никто жать не будет.

Понятно, что и текущий вариант с внутренним редиректом - рабочий, но хочется, чтобы в логах всё было нормально.

IL
На сайте с 20.04.2007
Offline
435
#1
Thanx:
при попытке открыть некий sample.jpg файл, открывает sample.php файл.

Вообще, не уверен в целесообразности такого решения.. ну да пусть останется на совести разработчика...

Thanx:
Если так делать, то да, откроется именно php страница, но на ней, пока не нажмёшь F5, никак не будет загружен jpg.

так открывается php-страница? или php-файл отдаёт изображение в формате jpg? Отдаёт ли он при этом нужный заголовок content-type?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
T
На сайте с 23.11.2005
Offline
298
#2

ivan-lev, так нажмите плиз, на ссылку, и увидите всё сами

siv1987
На сайте с 02.04.2009
Offline
427
#3

Никак.

1) Сделать редирект по отсутствующему рефереру

2) Сделать редирект по каким-то еще другим параметрам где можно определить, что картинка была запрошена напрямую.

RewriteCond %{HTTP_REFERER} !^http://site.ru/

RewriteRule RewriteRule ^(.*)\.jpg$ /$1.php [R=301,L]

[Удален]
#4

Добрый день.

Предлагаем к рассмотрению и тестированию наш проект - Маркетер Плагин.

Продвигаем его успешно во всем мире. Но только 27 января 2013 предоставили в Рунете к тестированию русифицированный плагин с русифицированным интерфейсом. Вся подробная информация наhttp://www.marketerplugin.ru/

Предлагаем протестировать наш плагин на только что русифицированном интерфейсеhttp://www.marketerplugin.ru/test_plagina.

В двух словах: плагин предназначен для создания сайтов-визиток и страниц продаж.

Ждем ваших комментариев, отзывов и критики.

Так же будем рады видеть вас на наших страницах в соц сетях

http://www.facebook.com/pages/Marketer-plugin/5288148..

http://vk.com/club46912629

Успехов и новых впечатлений.

С уважением, Богдан

IL
На сайте с 20.04.2007
Offline
435
#5

Не сразу понял, что ссылки "живые"..

Thanx:
но хочется, чтобы в логах всё было нормально.

А что именно "не нормально"? 200 ОК - код успешного выполнения.

Если будет принято решение в пользу редиректа по рефереру - иметь ввиду, что поисковые роботы (G/Я.картинки и тд) реферер могут не указывать.. т.е. я бы добавил ещё условие вроде

RewriteCond %{HTTP_USER_AGENT} !(google|yandex) [NC]
T
На сайте с 23.11.2005
Offline
298
#6

Я ещё немного поясню о том, что я сделал в .htaccess.:)

Про рефёрреры я знаю, и про то, что при переходе с гугла-картинок рефёррер может не отдаваться, тоже знаю. Дело немного не в этом.

У меня есть оригинальные фотографии, и их превьюхи 300*200.

С превьюхами всё просто, они лежат в подпапке /p/, и я их спокойно, внешним редиректом, с гугл поиска перенаправляю на оригинал, вот так:

RewriteCond %{REQUEST_URI} ^(.*)/p/(.*)jpg$

RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]

RewriteCond %{HTTP_REFERER} !^http://(www.)?indiatourism.ws/

RewriteRule ^(.*)/p/(.*)jpg$ $1/$2php [R=301,L]

Т.е. если это 1) превьюшка, 2) не гугл бот, 3) не мой сайт их пытается посмотреть, то редирект на оригинал. Но здесь спокойно делется внешний редирект, ведь меняется сама картинка: вместо превьюхи будет показана другая - оригинал. Тут всё красиво. Это вариант перехода с гугл-картинок на мой сайт, когда картинка - превьюха.

А не красиво вот когда, когда идёт переход с гугл-картинок на мой сайт, когда картинка - сам оригинал. Дело в том, что в данном случае картинка сама не меняется на другую, и внешний редирект не прокатывает, ибо если написать так:

(первые два условия проверяют, что это jpg, но не превьюха)

RewriteCond %{REQUEST_URI} jpg$

RewriteCond %{REQUEST_URI} !^(.*)/p/(.*)jpg$

RewriteCond %{HTTP_USER_AGENT} !(Opera|Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]

RewriteCond %{HTTP_REFERER} !^http://(www.)?indiatourism.ws/

RewriteRule ^(.*)jpg$ $1php [L] [R=301,L]

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

Вот поэтому я и пишу строчку последнюю так:

RewriteRule ^(.*)jpg$ $1php [L]

т.е. с внутренним редиректом.

А хочется внешний редирект сделать и в этом случае.

Я поначалу думал, что тут для первого апача нужна имитация флага [END], т.е. чтобы при открытии обработанного редиректом php файла уже не срабатывало правило 301 редиректа для самой открытой страницы (а ведь у неё по-прежнему нет рефёррера от indiatourism.ws), но ничего не получается.

http://stackoverflow.com/questions/7798099/how-to-block-multiple-mod-rewrite-passes-or-infinite-loops-in-a-htaccess-cont

Имитация флага [END]

в виде

# This header flags that there's no more rewriting to be done.

# It's a kludge until use of the END flag becomes possible in Apache v2.3.9+

# ######## REMOVE this directive for Apache 2.3.9+, and change all [...,L,E=END:1]

# ######## to just [...,END] in all the rules below!

RequestHeader set SPECIAL-HEADER-STOP-FURTHER-REWRITES-kjhsdf87653vasj 1 env=END

# If our special end-of-rewriting header is set this rule blocks all further rewrites.

# ######## REMOVE this directive for Apache 2.3.9+, and change all [...,L,E=END:1]

# ######## to just [...,END] in all the rules below!

RewriteCond %{HTTP:SPECIAL-HEADER-STOP-FURTHER-REWRITES-kjhsdf87653vasj} =1 [NV]

RewriteRule .* - [L]

даёт ошибку сервера 500

Прямо не знаю, что делать. Хочется настроить идеально.

IL
На сайте с 20.04.2007
Offline
435
#7
Thanx:
то так как картинка jpg не меняется, то при редиректе на открытой юзеру странице картинки видно не будет, ибо мы же по этой картинке и редиректили.

Можно в коде подсовывать "другой" адрес (отличный от адреса страницы)..

0. возможно, поможет пачка заголовов, запрещающих кэширование (nocache, expired, must revalidate итд)

0.1 делать не 301 редирект.. 301 - "постоянный"..

1. blabla.jpg?rand=xxxxx

2. сделать картинку доступной по двум адресам и в коде писать "другой" (отличный от REQUEST_URI)

p.s. Если всё указанное (по отдельности или в совокупности) не поможет - имеет смысл погуглить antihotlinking

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