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

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

Автор: Cheery
Дата сообщения: 24.10.2013 02:38
perdun

Цитата:
я тут имел ввиду его (бэкэнда) собственное имя, а не другого вирт.хоста.

я же сказал, прокси выполняет сугубо одну роль - передать запрос дальше, получить ответ и вернуть его. и делает он это "как есть", то есть что получил, то и отдал.

Вам нужно или делать это скриптом, обрабатывая и меняя ссылки, пути к картинкам, css файлам..
или же на бэкенды выдавать ссылки без имени сервера, но добавляя имя поддомена.
Автор: perdun
Дата сообщения: 24.10.2013 06:35
Cheery
my brain halt.


Цитата:
я же сказал, прокси выполняет сугубо одну роль - передать запрос дальше, получить ответ и вернуть его. и делает он это "как есть", то есть что получил, то и отдал.

это я понял.
нюанс в том, что на одном хосте (фронтенд) - есть модпрокси и там же модреврайт.. может быть эти задачи надо разделить по разным хостам..?


Цитата:
на бэкенды выдавать ссылки без имени сервера, но добавляя имя поддомена.

именно это я и хочу сделать..
может неверна логика конфига на фронтенде
Автор: Cheery
Дата сообщения: 24.10.2013 06:45
perdun

Цитата:
нюанс в том, что на одном хосте (фронтенд) - есть модпрокси и там же модреврайт.. может быть эти задачи надо разделить по разным хостам..?

я не понимаю что и зачем разделить.
[P] является последним правилом, что обрабатывается (то есть содержит флаг [L], по сути)

или вы о том, что у вас на тот же путь /поддомен настроен и mod_proxy?
что не так то, словами опишите.
Автор: perdun
Дата сообщения: 25.10.2013 12:50
Cheery

Цитата:
на бэкенды выдавать ссылки без имени сервера, но добавляя имя поддомена.

как это реализуется?
я не пойму, как на бэкенд прилетит запрос без имени сервера, если оно берется из имени виртуалхоста?

Код: <VirtualHost *:80>
DocumentRoot "/usr/local/www/apache22/data"
ServerName domen.tk
ServerAlias www.domen.tk
ErrorLog "/var/log/apache22/domen-error_log"
CustomLog "/var/log/apache22/domen-access_log" common

RewriteEngine on
RewriteRule ^(.+)/(.*) http://$1.domen.tk/$2 [P]
RewriteLog /var/log/apache22/rewrite.log
RewriteLogLevel 9

</VirtualHost>


<VirtualHost *:80>
ServerName finas.domen.tk
# ServerAlias finas.domen.tk
ErrorLog "/var/log/apache22/finas.domen-error_log"
CustomLog "/var/log/apache22/finas.domen-access_log" common
<Proxy balancer://finas >
BalancerMember http://192.168.121.61:8015
</Proxy>
ProxyPass / balancer://finas/
ProxyPassReverse / balancer://finas/
ProxyRequests On
ProxyPreserveHost On
</VirtualHost>
Автор: Cheery
Дата сообщения: 25.10.2013 20:48
perdun

Цитата:
я не пойму, как на бэкенд прилетит запрос без имени сервера,

говорилось о том, что бекенд должен иметь ссылки в своих страницах, которые соответствуют нужному пути на фронтенде.

и вместо ссылок вида http://сайт/путь
иметь ссылки вида /путь, в вашей ситуации вида /поддомен/путь
Автор: perdun
Дата сообщения: 26.10.2013 21:02
Cheery
тоесть, достаточно привести бэкенд к виду
http://finas/index.php/rezultaty-monitor
и в болансере прописать его по имени..?

просто сейчас они ходят там по айпи на нестандартный порт
http://192.168.121.61:8015/index.php/rezultaty-monitor
Автор: Cheery
Дата сообщения: 26.10.2013 21:09
perdun

Цитата:
тоесть, достаточно привести бэкенд к виду

без http:/

/finas/index.php/rezultaty-monitor
Автор: perdun
Дата сообщения: 27.10.2013 01:08
Cheery
ааа.. ну да, понял.. короче относительные ссылки должны там быть..
блин, ну это хреновенько, однако.. как бы они не были зашиты там в бинарь..

еще один момент
как поправить правило реврайта, чтобы перекидывало только если после слэша чото есть?

Код: RewriteRule ^/(.+)/?(.*) http://$1.domen.tk/$2 [P]
Автор: Cheery
Дата сообщения: 27.10.2013 01:17
perdun

Цитата:
как поправить правило реврайта, чтобы перекидывало только если после слэша чото есть?

вместо .* написать .+, ну и убрать ? перед /
Автор: perdun
Дата сообщения: 27.10.2013 01:52
Cheery
нот фоунд, аднака

Код: 217.118.79.43 - - [27/Oct/2013:05:38:10 +0700] [www.domen.tk/sid#28533d58][rid#290d7058/initial] (2) init rewrite engine with requested uri /finas/
217.118.79.43 - - [27/Oct/2013:05:38:10 +0700] [www.domen.tk/sid#28533d58][rid#290d7058/initial] (3) applying pattern '^/(.+)/(.+)' to uri '/finas/'
217.118.79.43 - - [27/Oct/2013:05:38:10 +0700] [www.domen.tk/sid#28533d58][rid#290d7058/initial] (1) pass through /finas/
Автор: Cheery
Дата сообщения: 27.10.2013 01:56
perdun

Цитата:
нот фоунд, аднака

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

Цитата:
/finas/

ничего нет после слэша.

или о каком говорили? приводите всегда примеры
Автор: perdun
Дата сообщения: 27.10.2013 02:08
Cheery
большое пасиба за помощь

неа, чота нифига не разобрался
фегня какаята

нада чтобы так
http://domen.tk/
или так http://domen.tk
правило не срабатывало
а если так
http://domen.tk/finas
или так http://domen.tk/finas/
то на субдомен http://finas.domen.tk

Автор: MisHel64
Дата сообщения: 27.10.2013 16:23
Столкнулся со странным..
(1) RewriteCond %{REQUEST_URI}    ^(.*)\.php$                    [NC]
(2) RewriteRule ^(.*)\.php$        http://%{SERVER_NAME}/aaa.html?%{REQUEST_URI}&bbb    [R=301,NC,L]
(3) RewriteRule ^[^\.]*$        /index.php                    [NC,L]

перехожу на сайт, и меня перебрасывает на http://${SERVER_NAME}/aaa.html?/index.php&bbb

Получается, что REQUEST_URI это не всегда запрошенный URI?
Что вместо него тогда можно использовать в RewriteCond?
Автор: Cheery
Дата сообщения: 27.10.2013 20:59
perdun

Цитата:
или так http://domen.tk
правило не срабатывало
а если так


ну, так чем это плохо?


Цитата:
RewriteRule ^/(.+)/?(.*) http://$1.domen.tk/$2 [P]


вы же понимаете, что
Цитата:
Reason: DNS lookup failure for: index.php.domen.tk

потому, что ваш запрос выглядит как http://domen.tk/index.php ?

с точки зрения правила - разницы между index.php и finas - нет.
придумайте как хотите отличать, тогда и проблем не будет.

можно добавить
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

чтобы правило срабатывало только к несуществующим на фронтенде файлам (если есть).



MisHel64

Цитата:
Получается, что REQUEST_URI это не всегда запрошенный URI?

не совсем вас понял..

у вас срабатывает два раза..

сначала идет на
Цитата:
RewriteRule ^[^\.]*$        /index.php                    [NC,L]

после этого апач делает подзапрос, снова проверяется и
Цитата:
RewriteRule ^(.*)\.php$        http://%{SERVER_NAME}/aaa.html?%{REQUEST_URI}&bbb    [R=301,NC,L]


что не так?
Автор: MisHel64
Дата сообщения: 28.10.2013 08:03

Цитата:
после этого апач делает подзапрос,

В том то и дело, что не подзапрос. Флаг подзапроса (не помню как зовут) в false установлен.
А второй запрос, при этом REQUEST_URI уже равен результату первого преобразования, а не реальному запросу, что в общем-то было не очевидно из документации.
Автор: Cheery
Дата сообщения: 28.10.2013 08:23
MisHel64

Цитата:
А второй запрос, при этом REQUEST_URI уже равен результату первого преобразования, а не реальному запросу, что в общем-то было не очевидно из документации.

я это и имел в виду. что это новый запрос, так как предудыщий закончился переходом на index.php
Автор: perdun
Дата сообщения: 28.10.2013 12:32
Cheery

Цитата:
ну, так чем это плохо?

ага, всё хорошо)
а порядок правил имеет значение?
а можно чтоб только на finas реагировал (а чтобы "что попало" в игнор)?
Автор: Cheery
Дата сообщения: 28.10.2013 17:21
perdun

Цитата:
а порядок правил имеет значение?

в смысле? сверху вниз.
все RewriteCond имеют отношение только к последующему RewriteRule
Автор: perdun
Дата сообщения: 29.10.2013 12:00
Cheery

Цитата:
в смысле? сверху вниз.

ясно, практически как правила фаервола)
===
тока что заметил, ошибка
Цитата:
Reason: DNS lookup failure for: index.php.domen.tk

сохраняется, если стучаться снаружи..
унутре всё хорошо..
и с днс-ом, кстати, тоже всё как надо (он у меня как сплит-днс, снаружи - одно, снутре - другое)
ищу багу..
Автор: Cheery
Дата сообщения: 29.10.2013 19:57
perdun

Цитата:
сохраняется, если стучаться снаружи..

потому что перебрасывает /index.php, логично же
Автор: perdun
Дата сообщения: 30.10.2013 06:57
Cheery
дык а снутре почему не перебрасывает? разница то белый\серый ип..
Автор: Cheery
Дата сообщения: 30.10.2013 21:21
perdun

Цитата:
дык а снутре почему не перебрасывает?

я не знаю, что у вас "снутре", а что нет.
как и какие правила обрабатываются в одном случае и в другом.

причину я указал - то есть у вас образуются ссылки с index.php
можете добавить еще правило, что если index.php или иное, с точкой, на месте поддомена, то не обрабатывать.
Автор: prestigo
Дата сообщения: 11.01.2014 22:26
есть такое условие:

RewriteCond install/index.php -f
RewriteRule ^install/(.*)$ install/index.php?r=$1 [L]

но RewriteCond не проходит, потому что проверяемый на существование файл лежит в %{DOCUMENT_ROOT}RewriteBaseinstall/index.php

собственно вопрос - как исхитриться составить работающее условие для RewriteCond?
Автор: Cheery
Дата сообщения: 11.01.2014 22:29
prestigo
я же вам ответил в той теме.
RewriteCond %{DOCUMENT_ROOT}/RewriteBaseinstall/%{REQUEST_URI} -f
Автор: prestigo
Дата сообщения: 11.01.2014 23:07

Цитата:
я же вам ответил в той теме.
RewriteCond %{DOCUMENT_ROOT}/RewriteBaseinstall/%{REQUEST_URI} -f


вы закрыли тему и не дали возможность прокомментировать

нет, не то
нужно как-то подставить значение RewriteBase в правило RewriteCond
т.е. иначе говоря проверить существование файла
/home/maestro/Документы/Programs/web/base/cms_demo/public_html/install/index.php
при
%{DOCUMENT_ROOT} = /home/maestro/Документы/Programs/web/base/
и
RewriteBase = /cms_demo/public_html/
Автор: Cheery
Дата сообщения: 11.01.2014 23:19
prestigo

Цитата:
нет, не то

что значит "не то"?
RewriteCond %{DOCUMENT_ROOT}/cms_demo/public_html/%{REQUEST_URI} -f
возможно нужно убрать кое где слэши, чтобы не получались двойные.
Автор: prestigo
Дата сообщения: 11.01.2014 23:22

Цитата:
RewriteCond %{DOCUMENT_ROOT}/cms_demo/public_html/%{REQUEST_URI} -f


/cms_demo/public_html/ УЖЕ находятся в RewriteBase
указывая его явно в условии для правила, мы дублируем сущности
т.е. его нужно как-то оттуда извлечь
Автор: Cheery
Дата сообщения: 11.01.2014 23:27
prestigo

Цитата:
т.е. его нужно как-то оттуда извлечь

вы проверяете файловую систему, а не URL

если хотите использовать переменные - есть модули для апача, позволяющие задавать и использовать переменные.
Автор: prestigo
Дата сообщения: 11.01.2014 23:34

Цитата:
вы проверяете файловую систему, а не URL

если хотите использовать переменные - есть модули для апача, позволяющие задавать и использовать переменные


URL в данном условии мне не интересен в принципе - я проверяю только наличие определенного файла в определенном каталоге

чуть выше я уже задал перменную - это RewriteBase
возможно ли как-то воспользоваться им явно в условиях для правила?
Автор: Cheery
Дата сообщения: 11.01.2014 23:37
prestigo

Цитата:
возможно ли как-то воспользоваться им явно в условиях для правила?

нет.


Цитата:
URL в данном условии мне не интересен в принципе - я проверяю только наличие определенного файла в определенном каталоге

я вам поясняю разницу.. RewriteBase оперирует с URL, проверка файла - с файловой системой. То, что у вас совпадает, хорошо, но, в принципе, нет такой задачи - получение в htaccess значения RewriteBase.

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

ну или генерите .htaccess не вручную, если вам приходится его создавать и править больше, чем один раз.

ps: кстати http://www.zeilenwechsel.de/it/articles/8/Using-mod_rewrite-in-.htaccess-files-without-knowing-the-RewriteBase.html

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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