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

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

Автор: unreal666
Дата сообщения: 26.03.2013 21:54

Цитата:
у зеленого RewriteRule есть условие. у красного - нет.

т.е. RewriteCond работает только для 1-го RewriteRule?
Автор: Cheery
Дата сообщения: 26.03.2013 21:55
unreal666

Цитата:
т.е. RewriteCond работает только для 1-го RewriteRule?

я вам об этом и пишу уже много раз
Автор: unreal666
Дата сообщения: 26.03.2013 22:05

Цитата:
я вам об этом и пишу уже много раз

не видел такого.
Если про

Цитата:
RewriteRule, следующий за этими RewriteCond, используется тогда и только в том случе, если URI на данный момент попадает под шаблон в RewriteRule (о котором шла речь выше) и эти условия (во всех RewriteCond до упомянутого ранее RewriteRule) выполняются.

то "следующий/following" не значит 1-ый. Это любой нижеследующий (до следующего RewriteCond). Вот и нюанс в описании.

PS.
Так. Тогда у меня косяк.
У меня есть такой кусок в htaccess (ссылки изменены).

Код:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^xxx\.html?$ index.php?aaa
RewriteRule ^yyy\.html?$ index.php?bbb
RewriteRule ^zzz\.html?$ index.php?ccc
Автор: Cheery
Дата сообщения: 26.03.2013 22:14
unreal666

Цитата:
не видел такого.


Цитата:
rewritecond влияют только на ОДИН rewriterule,


Цитата:
игнорируется только один rewriterule, который идет за (в файле) группой rewritecond  

и тд и тп.


Цитата:
то  "следующий/following" не значит 1-ый.

значит.. сказано в единственном числе

Цитата:
The following rule is then



Цитата:
Было сделано из расчета, что RewriteCond применяется ко всем нижележащим RewriteRule.
Как тогда переписать такое из расчета, что RewriteCond применяется только к 1-му RewriteRule?

повторить его перед каждый rewriterule


Цитата:
В английском правило в единственном числе. В русском - во множественном.

достаточно посмотреть примеры для понимания. и читать оригинальные мануалы, если возникают вопросы или непонятки с переводом.
Автор: Laterport
Дата сообщения: 20.08.2013 17:55
При обращении к "сайт/browse.php/" веб сервер выбивает 404 ошибку, без слэша все ок. Знающие, подскажите, пожалуйста, каким способом срезать слэш и редеректить на "/browse.php"
Автор: Cheery
Дата сообщения: 20.08.2013 21:18
Laterport

Цитата:
веб сервер выбивает 404 ошибку, без слэша все ок

тут вопрос в том, кто выдает эту ошибку - сервер или скрипт? потому что в php скрипт, таким образом, можно передавать параметры.
browse.php/gfg

REQUEST_URI    /browse.php/gfg
SCRIPT_NAME    /browse.php
PATH_INFO    /gfg

и если он получает эти данные, как то обрабатывает и выдает ошибку, то это одно..
тем более если он может и должен работать с подобными параметрами в иной ситуации.
а если выдает сообщение апач, то это другое.
Автор: Laterport
Дата сообщения: 20.08.2013 21:36
Cheery
Спасибо за ответ.
С этим разобрался, теперь нужно понять как убрать зацикливание которое проявляется например при таком запросе

index.php/wdfvevf/wefv/ewv/wefdv

Нагрузка процессора растет и я думаю он скажет пока через некоторое время, если не остановить запрос ) Требуется просто чтобы со ВСЕХ несуществующих страниц, редиректило на индекс. Я думал так и было, но если после индекса ещё слэш и какая-нибудь абракадабра "index.php/sdfvdsfvfd" то происходит зацикливание

сейчас в htaccess такое:


Цитата:

Options All -Indexes
RewriteEngine On
DirectoryIndex index.php
RewriteRule ^([^-]*)-page-([^-]*)\.php$ /page.php?n=$1&lang=$2 [L]
RewriteRule ^([^-]*)-page.php$ /page.php?n=$1 [L]
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
ErrorDocument 404 http://сайт/index.php
Автор: Cheery
Дата сообщения: 20.08.2013 22:20
Laterport

Цитата:
Нагрузка процессора растет и я думаю он скажет пока через некоторое время, если не остановить запрос

любой браузер отлавливает зацикленные лупы.


Цитата:
С этим разобрался, теперь нужно понять как убрать зацикливание которое проявляется например при таком запросе

ну тут нет явного цикла.. можете считать, к примеру, количество /


Цитата:
Требуется просто чтобы со ВСЕХ несуществующих страниц, редиректило на индекс. Я думал так и было, но если после индекса ещё слэш и какая-нибудь абракадабра "index.php/sdfvdsfvfd" то происходит зацикливание

вопрос тут в том, опять же, что определяет "существует" страница или нет??
она представлена реальным файлом или же запись в базе данных и все обрабатывает один скрипт?
Автор: Laterport
Дата сообщения: 20.08.2013 22:27
Cheery
Когда я пишу "сайт/asdsd" срабатыват редирект, все ок,
а когда именно с индексом сайт/index.php/тут_чего-нибудь_чего_нет", то нагрузка растет, браузер просто думает, я вижу в дебаге внизу на сайте что кол-во запросов к базе и нагрузка на неё так же растут. Не знаю куда копать.
Автор: Cheery
Дата сообщения: 20.08.2013 22:28
Laterport

Цитата:
а когда именно с индексом сайт/index.php/тут_чего-нибудь_чего_нет",

ну так это ваш скрипт перекидывает куда то в цикле..
в нем смотрите причину.
Автор: Laterport
Дата сообщения: 21.08.2013 07:16
Cheery
Может мне использовать какую-нибудь конструкцию реврайта чтобы вот такие вещи просто срезать? "*.php/dfdfdfdfdfd"? Т.е. если подобное забивают, чтобы возвращало просто на "*php". Подскажите, пожалуйста правильные выражения для этого.
Автор: Cheery
Дата сообщения: 21.08.2013 07:30
Laterport

Цитата:
Подскажите, пожалуйста правильные выражения для этого.

не лучше ли исправить ваш скрипт?
добавьте в него просто первой строкой, что если есть $_SERVER['PATH_INFO'], то перекинуть на себя и все..

Иначе просто проверяйте, есть ли в строке запроса \.php/
Автор: Laterport
Дата сообщения: 21.08.2013 07:44
Cheery
Дело в том что скрипт это движок, в котором я не вижу например $_SERVER['PATH_INFO'].
Аналогичные движки используют десятки других людей и на их страницах проблем нет.
Подскажите, пожалуйста на примере как отсекать \.php/
А вообще, я подозреваю ещё что конфиг nginx нужно поковырять, может там что криво прописано по отношению к бекенду.... Покажу тут в соответствующей теме конфиг.
Автор: Cheery
Дата сообщения: 21.08.2013 07:53
Laterport

Цитата:
Подскажите, пожалуйста на примере как отсекать \.php/  

RewriteCond %{PATH_INFO} !^$
RewriteRule (.*)\.php $1.php [L,R=301]

не проверял, но что то такое
Автор: Laterport
Дата сообщения: 21.08.2013 08:55
Cheery
Тысячу лучей теплого света Вам!
Теперь все ОК! Большое спасибо!

ЗЫ:
Школиё на другом форуме какую-то дрянь советовала, типа:

RewriteRule ^((.*?)\.php)/ $1 [NC,L]

Автор: Cheery
Дата сообщения: 21.08.2013 08:59
Laterport

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

ну может и сработала бы.. просто проще проверять наличие PATH_INFO
и можно переписать вторую строку, чтобы покороче
RewriteRule (.*\.php) $1 [L,R=301]

флаг NC - чтобы не учитывало регистр, но это уже по желанию/вкусу
Автор: Laterport
Дата сообщения: 21.08.2013 09:06
Cheery
Ещё раз спасибо. Вы часто выручаете!
Автор: IFKey
Дата сообщения: 16.09.2013 13:36
Просьба помочь с простым редиректом
Задача:
Перекинуть юзера с этого адреса (1): /index.php?option=com_akeebasubs&view=subscriptions&layout=default
На этот адрес (2): /online-subscription/subscribers-zone/subscriptions
Или можно сделать так чтобы скрипт зайдя на 1 адрес выполнял 2
Я перепробовал кучу примеров в том числе:


Цитата:
RewriteRule ^/online-subscription/subscribers-zone/subscriptions /index.php?option=com_akeebasubs&view=subscriptions&layout=default [L]


Цитата:
RewriteCond ^index.php?option=com_akeebasubs&view=subscriptions&layout=default$ [NC]
RewriteRule online-subscription/subscribers-zone/subscriptions [R=permanent,L]


Но ничего не работает, ошибок не выдает, но работа скрипта 2 не выполняется.
Так же перепробовал кучу вариантов, думал мол в адресах ошибался, со / и без него и т.п.
Автор: Bubek
Дата сообщения: 16.09.2013 16:28
Попробуйте что-то вроде этого:

RewriteCond %{QUERY_STRING} ^/option=com_akeebasubs&view=subscriptions&layout=default$ [NC]
RewriteRule ^index\.php[?a-z0-9_-]* /online-subscription/subscribers-zone/subscriptions? [R=301,L]
Автор: perdun
Дата сообщения: 21.10.2013 17:26
есь такой вопрос
ветку полистал, но к решению пока не пришел..
Автор: Cheery
Дата сообщения: 21.10.2013 20:18
perdun

Цитата:
Нужно, что бы при открытии www.domen.ru/host1 перебрасывало на host1.domen.ru, ну и так далее по списку..
Причем сама адресная строчка http://www.domen.ru/host1 при этом меняться не должна.

эм.. а поддомены на том же сервере и у апача есть к ним доступ?
сделайте алиасы

иначе вам придется прописывать правила на уровне virtualhost (правда и алиасы тоже).
.htaccess в папке не поможет.

ну или делать проксирование с помощью mod_proxy или же скриптов
Автор: perdun
Дата сообщения: 22.10.2013 05:38
Cheery

Цитата:
эм.. а поддомены на том же сервере и у апача есть к ним доступ?
сделайте алиасы

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

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

на "фронтенде" поднят апач с прокси-балансером с наконфигуреными вирт.хостами каждый в свой субдомен..

и всё как бэ даже работает.. просто не хочется светить в адр.строчке субдомены...
воть. как тотак хочу
Автор: Cheery
Дата сообщения: 22.10.2013 06:23
perdun
тогда только через проксирование

http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p

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

то есто что то вида
RewriteRule ^(.+)/(.*) http://$1.site.ru/$2 [P]
Автор: perdun
Дата сообщения: 22.10.2013 11:28
Cheery

Цитата:
тогда только через проксирование

да-да-да-да..
именно так и хочу сделать)

а куда правило писать? в хтакцесс или в конфигу вхоста?

Код: cat .htaccess

RewriteEngine on
RewriteRule ^(.+)/(.*) http://$1.domen.tk/$2 [P]
RewriteLog /var/log/apache22/rewrite.log
RewriteLogLevel 9
Автор: Cheery
Дата сообщения: 22.10.2013 19:04
perdun

Цитата:
апач 500-й ошибкой плюется и всё

ну так посмотрите лог ошибок сервера


Цитата:
RewriteLog /var/log/apache22/rewrite.log

не используется в .htaccess, если мне не изменяет память
Автор: perdun
Дата сообщения: 22.10.2013 21:05
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
Дата сообщения: 22.10.2013 21:13
perdun

Цитата:
где не так?

ну элементарно же.. слеши.. и если правило прописывается в конфиге, то путь там начинается с /

RewriteRule ^/(.+)/?(.*) http://$1.site.ru/$2 [P]

вот так попробуйте.

все, кроме создания логов, можно указать и в htaccess
но тогда нет начального слеша.
Автор: perdun
Дата сообщения: 22.10.2013 21:55
Cheery
ога, спасиба

единственно, еще такой момент
внутри сайта сцылки, ссылающиеся на имя вирт.хоста (всякие менюшки, "главная", и т.п.), дык они по-прежнему остаются..
http://finas.domen.tk/index.php/rezultaty-monitor

их можно каким-нибудь похожим способом.. перебить, иль это издержки проксирования..?
Автор: Cheery
Дата сообщения: 22.10.2013 23:08
perdun

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

я же объяснил - правильные ссылки должен выдавать тот хост, к которому обращаются.
в задачу прокси не входит обработка и замена ссылок.
Автор: perdun
Дата сообщения: 23.10.2013 10:44
Cheery

Цитата:
я же объяснил - правильные ссылки должен выдавать тот хост, к которому обращаются.

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

блин, даж нинаю чо придумать..

Добавлено:

Цитата:
ссылающиеся на имя вирт.хоста (всякие менюшки, "главная", и т.п.), дык они по-прежнему остаются..

я тут имел ввиду его (бэкэнда) собственное имя, а не другого вирт.хоста..
мошт, таки, над ним (запросом) еще как то на ходу можно поиздевацца..?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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