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

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

Автор: XM0ZG
Дата сообщения: 10.01.2008 04:16
Подборка информации, линков и книжек по теме mod_rewrite

http://pro-seo.ru/?p=43

книжки:
The Definitive Guide to Apache mod_rewrite
Professional Search Engine Optimization with PHP: A Developer’s Guide to SEO
Автор: Delphi6
Дата сообщения: 11.01.2008 13:14
Еще раз всем доброе время суток. Подскажите как можно сделать вот такую подмену пользователь заходит на мой сайт company.com а в реале данные идут из example.com. Понятно что все это надо будет делать через .htaccess. Я знаю допустим как можно сменить урл вида /data/picture.jpg на /data/engine.php?file=picuture так что пользователь даже не имеет представления что работает php движок. Но как такое сделать с доменном? Если кто запрашивает company.com/file/test.htm Апач в фоновом режиме должен подкачивать страничку с example.com/file/test.htm

п.с. Это нечто подобие форвардинга домена или AKA склейка доменов. Я пытался сделать через httpd.conf добавив в домене переадресацию "ScriptAlias / http://example.com/" а также через "Redirect / http://example.com/". Потом купил даже форвардинг домена у самого домен регистратора но если в первом случае была полная лажа, происходил банальный редирект, что меня вы понимаете не устраивает. А во втором случае хотя в адресной строке и оставался company.com но наводя маус на линки в статус баре виден не company.com/file/test.htm а example.com/file/test.htm
Автор: dacuan
Дата сообщения: 14.01.2008 09:38
Delphi6
Наиболее идейно-верным решением будет назначить example.com алиасом для company.com. Но если это не подходит, то можно попытаться использовать mod_proxy (читать по поводу флага P в правилах mod_rewrite).
Автор: giganet1
Дата сообщения: 21.01.2008 01:42
Здравствуйте.
Можете подсказать как с помощью реврайта сделать ссылки следующим образом

http://site.com/dl/server1/dir1/dir2/dirN/file.ext

http://site.com/dl.php?s=server1&path=dir1/dir2/dirN/file.ext
Автор: arcanum
Дата сообщения: 22.01.2008 12:06

Цитата:
Но на той странице куда я попал вместо этой ссылки уже ссылка http://servername/about/about/1.php а если и там по ней счёлкаю, то уже попадаю на страницу http://servername/about/about/about/1.php



ВО! Та же самая проблема. Задача какая... есть ссылки

_http://domain/link1.shtml
_http://domain/link2.shtml
_http://domain/link3.shtml
и несколько вот таких

_http://domain/sub_folder/link5.shtml
_http://domain/sub_folder/link6.shtml

Так вот, если я нажимаю на
_http://domain/sub_folder/link5.shtml - все честно отрабатывается и страница загружается, НО!! теперь если я подведу мышку на ссылку
_http://domain/link1.shtml - то у меня данный линк превращается вот вот что
_http://domain/sub_folder/link1.shtml

Т.е. после перехода по ссылке которая "как-бы" в папке ВСЕ ОСТАЛЬНЫЕ ссылки считают эту папку КОРНЕМ!!! Как решить трабл?



Автор: Jokerjar79
Дата сообщения: 22.01.2008 12:32

Цитата:
Здравствуйте.
Можете подсказать как с помощью реврайта сделать ссылки следующим образом

http://site.com/dl/server1/dir1/dir2/dirN/file.ext

http://site.com/dl.php?s=server1&path=dir1/dir2/dirN/file.ext


RewriteRule ^dl/([^/.]+)/(.*)(/?)$ dl.php?s=$1&path=$2 [L]

Автор: arcanum
Дата сообщения: 22.01.2008 12:36

Цитата:
Т.е. после перехода по ссылке которая "как-бы" в папке ВСЕ ОСТАЛЬНЫЕ ссылки считают эту папку КОРНЕМ!!! Как решить трабл?


Все, понял в чем проблема. А проблема в том, что ВСЕ ссылки записаны как

<a href="link1.shtml">Link1</a>

а нужно было писать

<a href="/link1.shtml">Link1</a> т.е. нужен был / (слеш)

Теперь второй вопрос, как написать реврайт, чтоб он учитывал этот слэш?? Или это нереально и придется все ссылки перебивать?
Автор: Apart
Дата сообщения: 22.01.2008 13:06
Как в htaccess приписать автоматическое определеные домена и вывод контента в зависимости от домена. Напр., если взять домены pageru.com.ua pageuk.com.ua pagefr.com.ua, у которых бы контент выдавался в виде pageru.html, pageru2.html, pageuk.html, pageuk2.html, pageuk3.html и пр.

Должно быть, наверное, что-то типа

RewriteCond %{HTTP_HOST} (www\.)?(директива определяющая домен)\.com\.ua [NC]
RewriteRule ^(.*)\.html$ (директива определяющая домен)$1.html [L,QSA]

Автор: Jokerjar79
Дата сообщения: 22.01.2008 13:09
Apart, это через виртуальные сервера реализовывается
Автор: Apart
Дата сообщения: 22.01.2008 14:02
А поконкретней?

ps: у меня виртуальный хостинг
Автор: Cheery
Дата сообщения: 24.01.2008 00:25
Apart

Цитата:
А поконкретней?

Виртуальные хосты в Apache 1.3.23, что то не получается...
Автор: Apart
Дата сообщения: 25.01.2008 15:16
Редактирование конфигов Apache - это не для шаред-хостинга. А у меня пока именно такой.
Автор: vitovt
Дата сообщения: 12.02.2008 12:35
что-то я не пойму, а в чем ошибка
RewriteRule ^([0-9A-Za-z\_\-\.]+)(\/)$ /user.php?id=$1 [L,QSA]

должно пропускать тока символы, допустимые в обычном урле, а с тире (-) не пропускает
Автор: Delphi6
Дата сообщения: 12.02.2008 20:37
Вот есть код который отвечает за обработку саб доменов:

Код: RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com
RewriteRule (.*) /subdomains/%1/$1 [L]
Автор: Delphi6
Дата сообщения: 13.02.2008 11:39
А вот и решение Вчера наверно усталость сказалась:

Код: RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/data/
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com
RewriteRule (.*) /subdomains/%1/$1 [L]
Автор: Serzhik83
Дата сообщения: 14.02.2008 12:07
Помогите разобраться.

В .htaccess всегда было написано:

Код: RewriteRule ^page/([0-9]+)(/?)$ page.php?id=$1
Автор: 6epcepk
Дата сообщения: 15.02.2008 09:27
Возвращаясь к теме, которая обсуждалась в принципах построения CMS.
Сейчас работает правило для реврайтинга много языкового сайта:

Код: RewriteRule ^(ru|en|de)/?news(/?)+$ index.php?lang=$1&module=news [L]
RewriteRule ^news(/?)+$ index.php?module=news [L]
Автор: Delphi6
Дата сообщения: 15.02.2008 22:07
6epcepk
1) Не думаю что бы можно было все к одной строке свести, либо придется воспользоваться IF оператором в регулярных выражениях но я не уверен что эта конструкция поддерживается в .htaccess (в PHP работает на ура). Еще не уверен что от этого будет прирост, вы все равно будете выполнять первое условие и если оно не даст результата то второе (правда если первое чаще происходит то немного прироста будет).

2) Если бы вы описали все возможные варианты запросов (урлов) то можно было бы придумать что-то оригинальное. Я лично никогда не работал с CMS и наизусть ничего не могу посоветовать, разве что как я подозреваю язык всегда две буковки и всегда перед news вот и можно прямо его брать и передавать без проверки (если есть гарант что скрипт н сгючит если ему передать например xx).

Добавлено:
Serzhik83

Цитата:
В .htaccess всегда было написано

А вы уверены что у вас разрешено использования mod_rewrite в этой директории? Многие хостера разрешают его размещать только в рутовую директорию.
Автор: Serzhik83
Дата сообщения: 16.02.2008 03:22

Цитата:
А вы уверены что у вас разрешено использования mod_rewrite в этой директории? Многие хостера разрешают его размещать только в рутовую директорию.


Все остальные правила из этого .htaccess работают
Автор: Cheery
Дата сообщения: 16.02.2008 03:24
Serzhik83

Цитата:
Все остальные правила из этого .htaccess работают

htaccess в какой дире лежит?
Цитата:
RewriteRule ^page/([0-9]+)(/?)$ page.php?id=$1

попробовать
RewriteRule ^/page/([0-9]+)(/?)$ page.php?id=$1
Автор: 6epcepk
Дата сообщения: 16.02.2008 10:13

Цитата:
Если бы вы описали все возможные варианты запросов (урлов) то можно было бы придумать что-то оригинальное. Я лично никогда не работал с CMS и наизусть ничего не могу посоветовать, разве что как я подозреваю язык всегда две буковки и всегда перед news вот и можно прямо его брать и передавать без проверки (если есть гарант что скрипт н сгючит если ему передать например xx).

К примеру, правила для обработки модуля "Новостная лента":

Код: RewriteRule ^(ru|en|de)/?news(/?)+$ index.php?lang=$1&module=news [L]
RewriteRule ^news(/?)+$ index.php?module=news [L]

RewriteRule ^(ru|en|de)/?news/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)(/?)+$
index.php?lang=$1&module=news&category=$2&news=$3 [L]
RewriteRule ^news/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)(/?)+$ index.php?module=news&category=$1&news=$2 [L]

RewriteRule ^(ru|en|de)/?news/([-_a-zA-Z0-9]+)(/?)+$ index.php?lang=$1&module=news&category=$2&%{QUERY_STRING} [L]
RewriteRule ^news/([-_a-zA-Z0-9]+)(/?)+$ index.php?module=news&category=$1&%{QUERY_STRING} [L]
Автор: Delphi6
Дата сообщения: 16.02.2008 10:36
6epcepk
Конечно можно, если вы в состоянии обработать все варианты. Правда придется писать немного по другому:

Цитата:
RewriteRule ^.*$ index.php?query_string=$1 [L]

А потом из скрипта уже передавать хидер с редиректом на нужную страничку (правда тогда будет виден реальный урл что вас не устраивает как я подозреваю). А генерировать http запрос это как бы дополнительно нагружать сервер (я так подозреваю).

А что если скрипту передать leng равный пустой строке ''?

Цитата:
RewriteRule ^(ru|en|de|)/?news/([-_a-zA-Z0-9]*|)/([-_a-zA-Z0-9]*|)(/?)+$ index.php?module=news&category=$1&news=$2 [L]

Я бы тоже самое сделал бы и другими параметрами (надо модернизировать запрос так что бы если данный параметр не указан захватывалась пустая строка), если у вас исходник то намного будет легче поправить index.php что бы он смог обрабатывать пустые параметры lang, category, news. Просто банально в начале index.php делаем проверку, если $_REQUET['leng'] == '' то делаем его удаление (как будто его не передавали) unset($_REQUET['leng']). Думаю должно сработать ...

p.s. Правда я не уверен в верности регулярного выражения, там немного сложней будет, но можно поэкспериментировать в РНР с разными урлами а только потом уже прописать в .htaccess что бы быть уверенным что все правильно захватывается.
Автор: 6epcepk
Дата сообщения: 16.02.2008 10:53

Цитата:
Конечно можно, если вы в состоянии обработать все варианты. А потом из скрипта уже передавать хидер с редиректом на нужную страничку (правда тогда будет виден реальный урл что вас не устраивает как я подозреваю). А генерировать http запрос это как бы дополнительно нагружать сервер (я так подозреваю).

А что мешает написать регулярные выражения до загрузки модулей (у меня это делается в файле index.php), после чего получаем "искусственно" все значения QUERY_STRING (при помощи того же pcre) и записываем их в $_GET, а загрузчик модулей уже работает как раз с $_GET.


Цитата:
Я бы тоже самое сделал бы и другими параметрами

Свежее интересное решение, я поэкспериментировал (пока без языкового параметра):

Код: RewriteRule ^news/([-_a-zA-Z0-9]*)/([-_a-zA-Z0-9]*)(/?)+$ index.php?module=news&category=$1&news=$2 [L]
Автор: Delphi6
Дата сообщения: 16.02.2008 11:44
6epcepk

Цитата:
А что мешает написать регулярные выражения до загрузки модулей (у меня это делается в файле index.php), после чего получаем "искусственно" все значения QUERY_STRING (при помощи того же pcre) и записываем их в $_GET, а загрузчик модулей уже работает как раз с $_GET.

Ой а вот на счет этого я как то не сообразил, как говориться а ларчик просто открывался Действительно намного легче сделать чем все остальное (в РНР у вас руки развязаны).


Цитата:
QUERY_STRING получается пустым на стороне сервера (убрал квантификатор `|` - apache выдавал 500-ю ошибку).

Я это предполагал вот почему сказал что сначала надо проверить в РНР и только потом прописывать в .htaccess. Сейчас немного занят, надо в своем скрипте немного доработку сделать а вот уже к вечеру займусь вашим рег. выражением, уверен что мы найдем решение .
Автор: 6epcepk
Дата сообщения: 16.02.2008 14:57
Решение оказалось на поверхности: необходимо было наложить условие на символ`/`, разделяющий данные в запросе:

Код: RewriteRule ^(ru|en|de)?/?news/?([-_a-zA-Z0-9]*)/?([-_a-zA-Z0-9]*)(/?)+$ index.php?lang=$1&module=news&category=$2&news=$3 [L]
Автор: Tonyas
Дата сообщения: 20.02.2008 20:20
Помогите правильно написать RewriteRule
Есть ссылка вида

http://site/folder/1f/1f/1/1/2006/xxxx/7/1/1/2003/xxx/7/l.gif

ее нужно преобразовать в ссылку вида
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2000&f=%C4%EE&k=3&l=1&m=1&n=2007&o=%E2&p=3


Вот так работает но частично 10 11 и 12 переменная на 1 заменяются
RewriteRule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/l.gif$ file.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&k=$7&l=$8&m=$9&n=$10&o=$11&p=$12

как правильно прописать?
Автор: Cheery
Дата сообщения: 20.02.2008 20:57

Цитата:
Есть ссылка вида

http://site/folder/1f/1f/1/1/2006/xxxx/7/1/1/2003/xxx/7/l.gif

ее нужно преобразовать в ссылку вида
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2000&f=%C4%EE&k=3&l=1&m=1&n=2007&o=%E2&p=3

вам не кажется, что между ними какое то несоответствие?
Автор: Tonyas
Дата сообщения: 21.02.2008 08:58
Ну немного не совпадает, но суть одна и та же
вот так
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2006&f=%C4%EE&k=7&l=1&m=1&n=2003&o=%E2&p=7

текст иероглифами набирать не умею

значения a b c d..... постоянно меняются, мне нужно чтоб картинка перебрасывала на запрос в файлик пхп, для 7 переменных чудно работает, а после 9 проблемы.
пробовала с помощью флага [с] сделать ссылку но чтото не получилось
Автор: Delphi6
Дата сообщения: 21.02.2008 11:29
Tonyas
Ну для начала вам надо почитать базис регулярных выражений, форум вам может помочь но вряд ли сделает это за вас ))) Посмотрите готовые примеры из цикла 4 статей в шапке темы, я уверен что после прочтения его вы уже самостоятельно сможете его составить (он очень простой).
Автор: Tonyas
Дата сообщения: 22.02.2008 14:02
Delphi6, как вы думаете зачем я прошу помочь, если сама могу написать и все так просто.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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