Ru-Board.club
← Вернуться в раздел «Web-программирование»

» mod_rewrite: документация, готовые решения, вопросы

Автор: Yagovdik
Дата сообщения: 11.04.2006 18:09
У меня к ним доступа нету

Вообще задача несколько упростилась...

теперь я хочу для рула применять ТОЛЬКО запросы от посетителей, которые пришли НЕ с моего сайта.
Пишу в .htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^.*%{HTTP_HOST}.*$ [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1 [L]

Для пустого реферера все работает правильно - рул не выполняется...
А вот для реферера с моего же сайта все равно редиректается на logger.php
В чем ошибка то?
Автор: Cheery
Дата сообщения: 11.04.2006 18:17
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
а так? [NC] тоже вроде как необязательно, но можно оставить
Автор: Yagovdik
Дата сообщения: 11.04.2006 18:35
неа - не работает
в [HTTP_REFERER] локальный урл
а все равно редиректается на логгер
Автор: Cheery
Дата сообщения: 11.04.2006 18:38
Yagovdik

Цитата:
а все равно редиректается на логгер

тогда ощущение, что не совпадает http_host с тем, с чем надо..
RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST}
или в самом php скрипте посмотри, чем равно значение переменной?
Автор: Yagovdik
Дата сообщения: 11.04.2006 18:45
$_SERVER['HTTP_HOST'] => yag.ph****s.net

[argv] => Array
(
[0] => xpage=logger.php&host=yag.ph****s.net
)

xpage=logger.php - это из-за того что редирект еще раз прогоняется
это мой сервер - все правильно
Автор: Cheery
Дата сообщения: 11.04.2006 18:51

Цитата:
xpage=logger.php - это из-за того что редирект еще раз прогоняется
это мой сервер - все правильно

дык сделай, чтобы не прогонялся.. или добавь 3 условие
причина то как раз в этом и может быть..
RewriteCond %{QUERY_STRING} !^\/loggep\.php
но если честно, то я не вижу причин (наверно просто не выспался).
в таких ситуациях неплохо бы включить логирование обработки mod_rewrite на тестовом сервере и посмотреть обработку.

Автор: Yagovdik
Дата сообщения: 11.04.2006 18:56
ну вот какой файл получился
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !logger\.php
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST}

и не работает
Все равно не понимает своего реферера

Добавлено:
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
а вот это правило означает что в HTTP_REFERER не влкючается HTTP_HOST да?
потому что HTTP_HOST у меня без http://, а реферер С http://

Я прошу прощения, но мне нужно идти - отвечать сегодня не смогу
Надеюсь завтра вернемся к разговору.
Автор: Cheery
Дата сообщения: 11.04.2006 19:13
Yagovdik
ок, я нашел причину.. достаточно двух первых условий, как ты писал раньше..
причина в том, что HTTP_HOST содержит точки и когда это подставляется в RewriteCond, то сервер воспринимает их как часть регулярного выражения. И, хотя, при этом оно должно все равно совпадать, но не хочет
поэтому вместо %{HTTP_HOST} нужно честно писать выражение вида !sudomain\.domain\.ru
Автор: Yagovdik
Дата сообщения: 12.04.2006 08:35

спасибо...
Но хоста я не знаю, к сожалению. Этот скрипт должен быть сервисом, свободно устанавливаемым на любые сайты существующие и проектируемые
Но это так сказать мои догадки... чё там придумал заказчик я не знаю...

А в mod_rewrite функций никаких нету?
Мне казалось что пока я искал вопрос на этот ответ - где то мелкало strtolower . По-моему через хэндлер или что то в этом роде...
Кто-нибудь имеет примерчик подобный?

Добавлено:
Да - проверил - действительно - работает
Но не совсем правильно...
Почему то [QUERY_STRING] => xpage=logger.php&host=yag.ph****s.net
то есть похоже на то, что редирект срабатывает несколько раз.
Кроме того в $_SERVER есть вот что:
[REDIRECT_QUERY_STRING] => xpage=logger.php&host=yag.ph****s.net
[REDIRECT_REDIRECT_STATUS] => 200
[REDIRECT_STATUS] => 200
[REDIRECT_URL] => /logger.php

в .htaccess в итоге лежит вот что:
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !yag\.ph****s\.net [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST} [L]

Добавлено:

Цитата:
то есть похоже на то, что редирект срабатывает несколько раз.

а реферер при этом остается с удаленного сервера
Автор: Yagovdik
Дата сообщения: 13.04.2006 08:14


Два последних дополнения решились. ЧТо то я стормозил.
Итого окончательный .htacces

Код:
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !yag\.ph****s\.net.* [NC]
RewriteCond %{REQUEST_FILENAME} !logger\.php.* [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1 [L]
Автор: kitty05
Дата сообщения: 14.04.2006 16:10
есть задача:

когда вызывается УРЛ __http://www.somehost.com/fa/private/xxx/zzz/file.rar -
нужно перенаправлять незаметно для пользователя запрос на __http://www.somehost.com/fa/download/xxx/zzz/file.rar.

т.е. нужно заменить всего часть УРЛ - /private/ на /download/

как сделать?

PS> правило должно действовать только для файлов, не для каталогов.
Автор: Erick Flatcher
Дата сообщения: 17.04.2006 12:00
Подскажите пожалуйста:

есть URL: site.ru/index.php/razdel/
хочу URL: site.ru/razdel/

Предлагают:

1. Как я понимаю это автоматом проверяет, где надо и не надо переименовывать и уже на ходу решает. Так ли это?

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f (это проверяет есть ли такой файл и если есть не переименовывает URL? Так?)
RewriteCond %{REQUEST_FILENAME} !-d (это проверяет есть ли такая директория и если есть не переименовывает URL? Так?)
RewriteRule ^(.*)$ /index.php/$1 [L]

2. Явное указание директорий где НЕнужно переименование:

RewriteEngine on
RewriteCond $1 !^(images|system|themes|favicon\.ico|robots\.txt|index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L]

Какой из этих методов вы посоветуете использовать? Первый мне мниться более предпочтительным, но боюсь как бы он не сильно сервер загрузил ;-( Запросов должно быть много (посещаемость сайта 12.000+ хостов в сутки).

Большое всем спасибо.
Автор: phpcoder
Дата сообщения: 22.05.2006 18:28
Такую задачу не могу решить:
делаю мод-рерайтом директорию, например http://domain.com/dir/

Код:
RewriteEngine On
Options +FollowSymLinks
RewriteCond %{REQUEST_URI} !(index.php) [NC]
RewriteRule ^(.*)/$ /index.php?cat=$1 [L]
Автор: iglezz
Дата сообщения: 11.06.2006 20:44
phpcoder
а если так?

Код: RewriteCond %{REQUEST_URI} !(index\.php) [NC]
RewriteRule ^(.*[^/])$ /index.php?cat=$1 [S]
RewriteRule ^(.*)/$ /index.php?cat=$1 [L]
Автор: dacuan
Дата сообщения: 13.06.2006 09:22
phpcoder
Для борьбы с недостающими слэшами использую следующий метод:
В самом конце файла .htaccess пишу следующее правило.
Важно Правило должно быть последним

Код:
###########################
# SLASH PROBLEM
###########################

RewriteCond %{REQUEST_URI} !/$
RewriteCOND %{REQUEST_URI} ![^/]*\.[^/]*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [NS,L,R=301]
Автор: SiMM
Дата сообщения: 13.06.2006 10:24
dacuan, и что у вас получится, если дадут необрабатываемую предыдущими правилами ссылку? Бесконечный редирект...
Автор: dacuan
Дата сообщения: 13.06.2006 10:39
SiMM
Бесконечного редиректа не будет из-за строки

Код:
RewriteCond %{REQUEST_URI} !/$
Автор: SiMM
Дата сообщения: 13.06.2006 14:52
Да, виноват, просмотрел.
Автор: razawa
Дата сообщения: 03.07.2006 09:16
Почитал тему.
Вот что у меня вышло. Простая замена всех *.htm запросов на index.php?path=*.htm

Код: RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_URI} !^.*index.php.*
RewriteRule ^(.*)(\.ht.*)$ http://www.www.com/index.php?path=$1$2
Автор: sTa1kEr
Дата сообщения: 03.07.2006 09:45

Цитата:
Но как сделать чтобы пользователь не видел это index.php

Пользователь итак его не видит


Код: RewriteEngine on
RewriteCond %{REQUEST_URI} \.html?$
RewriteRule ^(.*)$ index.php?path=$1 [L]
Автор: razawa
Дата сообщения: 03.07.2006 10:25

Цитата:
Пользователь итак его не видит

Оппа. Ваш случай работает и не видно лишнего В общем у меня в .htaccess много было лишнего и закомментировано. Почистил - и в моем варианте перестало быть видно.
Да и у меня было http://www.www.com/index.php, а надо было сразу index.php

Цитата:
Имхо, так будет правильнее, короче и удобнее.

Спасибо. Я изначально разделял путь и имя файла, но думаю правильнее будет в скрипте это сделать.

Цитата:
Options +FollowSymlinks здесь не к месту

Могу только сказать "гы".
Спасибо, выручили. Все так просто, а я страдаю

Автор: obla4ko4240019
Дата сообщения: 03.07.2006 11:23
ребят, простенькая по идее задача, но разобраться не могу в htaccess.
надо чтобы ссылки типа http://site.com/?item=book1 заменялись на http://site.com/book1/ и http://site.com/?item=book1_6 на http://site.com/book1/06.html
Автор: Pirates
Дата сообщения: 04.07.2006 12:10
Простая проблема, но справиться с ней самостоятельно не выходит..

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

Задача: при запросе файлов с расширением .shtml, .html, .htm выдавать файл с тем же именем, но с расширением .php. Как это сделать?

Следующая конструкция не работает:

RewriteEngine on
RewriteCond %{REQUEST_URI} \.shtml?$
RewriteRule ^(.*)$ $1.php [L]
RewriteEngine off
Автор: dacuan
Дата сообщения: 04.07.2006 12:28
Pirates
Надо так:

Код:
RewriteEngine on
RewriteCond %{REQUEST_URI} \.shtml?$
RewriteRule ^(.*)\.shtml?$ $1.php [L]
Автор: sTa1kEr
Дата сообщения: 04.07.2006 18:17

Цитата:
RewriteCond %{REQUEST_URI} \.shtml?$

Под такое условие не будут поподатся .html и .htm. В данном случае наверное проще будет сделать следующим образом:

Код:
RewriteEngine on
RewriteRule ^(.*)\.(shtml|html|htm)$ $1.php [L]
Автор: Pirates
Дата сообщения: 04.07.2006 19:35
sTa1kEr, dacuan
Спасибо, но в обоих случаях продолжает упорно выдаваться 404 Приходится спасаться пока лишь

Код:
ErrorDocument 404 /index.php
Автор: sTa1kEr
Дата сообщения: 04.07.2006 19:47
Pirates

Цитата:
ErrorDocument 404 /index.php

Так тебе надо что бы выводился index.php или
Цитата:
выдавать файл с тем же именем, но с расширением .php
?
Автор: dacuan
Дата сообщения: 05.07.2006 09:12
Pirates
Что видно с RewriteLogLevel 9?
Автор: Pirates
Дата сообщения: 06.07.2006 13:47
sTa1kEr

Цитата:
Так тебе надо что бы выводился index.php

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

dacuan

Цитата:
в случае любых проблем с mod_rewrite в httpd.conf
...
Что видно с RewriteLogLevel 9?

К сожалению, httpd.conf не доступен для редактирования Саппорт хостера в дауне уже пару месяцев.
Автор: vii
Дата сообщения: 02.08.2006 06:29
Подскажите, кто может...
Есть два сайта. http://site1.com/ и http://site2.com/. Хочу использовать для 2-х сайтов один портальный движок. Движок сам обрабатывает URL и посему подставляет нужный контент. Если бы был свой Апач, то задача решалась бы тривиально. Я бы сделал один виртуалный сервер и создал бы ему серверАлиас. Тогда все запросы направлялись бы в одну директорию (но с разными URL), и дальше портал сам делал бы что нужно.
Но Апач чужой...
Можно ли через mod_rewrite преобразовывать http://site1.com/xyz/ в http://site2.com/xyz/ ? Перепробывал кучу вариантов. Получается либо банальный редирект (т.е. с заменой URL), либо вообще не работает.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.