Htaccess и mod_rewrite

Возникла такая проблема:
требуется посетителям, заходящим на сайт с определенного урла, вместо главной страницы подсунуть свой файл. Сначала показалось, что проблем не будет – забить в htaccess нужные правила и все.
Но конструкция (как кажется, правильная) не действует.
Сейчас htaccess выглядит так –

CharsetSourceEnc UTF-8
CharsetDefault UTF-8
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http://badsite.ru/.*$
RewriteRule ^/$ /you-suck.htm [L]

  1. BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

  1. END WordPress

Не работает. Хочется совета:rolleyes:

у тебя 2 раза включен мод реврайт попробуй пропиши так

CharsetSourceEnc UTF-8
CharsetDefault UTF-8

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_REFERER} ^http://badsite.ru/.*$
RewriteRule ^/$ /you-suck.htm [L]
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Не действует. Страница открывается, редиректа не происходит, ошибок в логах тоже нет. Мистика какая-то.
http://wordpress.org/support/topic/62400?replies=9 вот здесь пишут про необходимость дропить таблицу в БД для пересоздания правил. Теме, правда, год уже.
Это что же означает, что WP единожды прописанные правила не обновляет что ли?

хз сам парюся с мод реврайтом нужен примерно такой же результат как у тебя.

А что мешает в index.php анализировать HTTP_REFERER и делать редирект через header()?

!!!Кстати неплохая идея!
Но все равно постараюсь разобраться с мод реврайтом.

Максим, а можно как-нибудь подетальнее?:)

+1

В главном каталоге WordPress есть файл index.php. Из нескольких строчек. Можно в него в начало добавить условие на проверку HTTP_REFERER.

if ( $_SERVER['HTTP_REFERER'] == 'http://...' )  действия с плохим сайтом  ;

Максим, действие будет вида redirect(‘/’)?

А мне нужно сделать проверку по реферреру на определенной странице, например раньше делал такие условия в сайдбаре (sidebar.php)

<?php
  if ( is_page('6')  )
    {
echo 'Страница id6 например';
    }
else
    {
     wp_list_categories("orderby=name&title_li=");
     }
?>

Теперь нужно чтобы на страницу с id6 могли попасть только с определенного реферрера, а всех у кого реферрер пустой (зашли по прямой ссылке) или не соответствует указанному отправляло на главную страницу, подскажите как это сделать?
точнее как в вышеприведенному коду добавить условие проверки реферрера?
Подскажите пожалуйста.

Хм… Ну ладно. Редирект на php выглядит так:

header("Location: http://your_site/new_page.html");
exit;

Если же вы хотите делать каие-то выборочные действия, например в сайд баре, то опятьже смотрите переменную $_SERVER[‘HTTP_REFERER’] и делаете то, что вам нужно.

Максим, спасибо. Дело в том, что на дефолтной теме это проходит, а в моей index.php больше, чем несколько строк, быть может это и вызывает проблемы.
Спасибо за помощь еще раз.

Сделал так

<?php
$my_page = 'http://пускать только с этого реферрера.php';
if(is_page('6') && ($_SERVER['HTTP_REFERER'] == $my_page)){
echo "Добро пожаловать!";
}else{
header("Location: http://google.com");
}?>

Вчера работало что странно…сейчас нет подскажите может что ни так сделал?

У меня не работает ни под каким соусом. Через mod_rewrite даже через данную хостером конструкцию (она даже без редиректа – просто на запрет с определенных урлов), ни через редирект в хедере.

чтобы не плодить темы, решил написать здесь

На моем хостинге находятся 3 сайта, один из них блог.
Site1.com (блог на вордпресс) лежит в корневом каталоге, site2.com и site3.com лежат в папках site2 и site3. В панели управления хостингом для сайтов site2 и site3 стоит редирект в соответствующие папки.
Если пользователь набирает site1.com site2.com site3.com то попадает на эти сайты и в адресной строке отображаются адреса этих сайтов.
Я добавил в .htaccess код, чтобы site1.com все время был с www. Но возникла проблема, что если набрать в адресной строке site2.com или site3.com, то пользователь редиректится на www.site1.com/site2 или www.site1.com/site2 (что мне не нужно, т.к. не хочу, чтобы польлзователь видел связь этих доменов). Я так понимаю, что надо прописать в .htaccess какое-то исключающее условие, но как это сделать не знаю. Буду очень признателен, если кто-нибдуь поможет.

мой .htaccess

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(.*)\.site1\.com$ [NC]
RewriteRule ^(.*)$ http://www.site1.com/$1 [R=301,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

По своим мукам с mod_rewrite понял следующее:
он работает как-то очень избирательно на разных сайтах (видимо из-за настроек апача у хостера).
Поэтому нормальное решение здесь испросить совета и помощи у тех. поддержки.

Вообще с mod_rewrite очень сложно работать. Слишком много подводных камней, да и апач у многих по разному настроен. Поэтому если есть возможность использовать редиректы на PHP, то лучше уж их и использовать. Как минимум это будет работать везде.

Fencer14, у вас задача по-идее решается с помощью паркованного (дополнительного) домена. То есть прописываете свои site2, как сининим site1 и site2 будет физически обращаться к site1, хотя адрес останется site2. Впрочем такая возможность должна быть разрешена в вашем тарифном плане. Такие же сининимы можно делать и с каталогами (поддоменами), опять же, если это разрешено в тарифном плане.

Anonymous
Отправить
Ответ на: