Форум программистов, компьютерный форум, киберфорум
Apache, htaccess
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
1

Не пойму как работает RewriteCond и RewriteRule

31.05.2018, 21:11. Показов 2066. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код из htaccess
Код
	
AddDefaultCharset utf-8
DirectorySlash Off
RewriteEngine On
Options +SymLinksIfOwnerMatch
RewriteBase /

#строка запроса в браузере http://xerox.never.test/resources/qwerty

	RewriteCond %{SERVER_NAME} ^xerox\.never\.test$
	RewriteCond %{THE_REQUEST} ^.*resources/qwerty.*$
	#RewriteCond %{REQUEST_URI} ^.*resources/?.*$
	#RewriteCond %{REQUEST_URI} ^.*/.*r+.*e+.*s+.*$
	#RewriteCond %{REQUEST_URI} ^.*/.*re+.*s+.*$
	RewriteCond %{REQUEST_URI} ^.{16,18}$
	RewriteCond %{REQUEST_URI} ^.*/.*r+.*e+.*$
	RewriteRule ^(.*)re?(.*)$ project/index.php [NC,L]
	#RewriteRule ^(.*)res?(.*)$ project/index.php [NC,L]
	#RewriteRule ^.*$ project/index.php [NC,L]
	#RewriteRule ^(.*)resources/?(.*)$ project/index.php [NC,L]

#Срабатывает условие из RewriteRule строки и выполняется скрит project/index.php.
Если снять комент с RewriteCond или заменить RewriteRule на тот что в коментарии. То скрипт (project/index.php) выполнятся Не будет.

Что сидит в REQUEST_URI. И какую строку обрабатывает RewriteRule ???
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2018, 21:11
Ответы с готовыми решениями:

RewriteCond влияет толко для один, следушчи RewriteRule. можно как-то превишать количество RewriteRule
здраствуите, вот что интересно, сделаю mod_rewrite и для етого в .htaccess фаиле пишу ...

Не работает RewriteCond
Имею локальный веб-сервер (Debian, Apache2.2.22) и настроенный виртуальных хост person.in.local ...

Не пойму, как работает.
Закончились идеи, как работает программа... Ничего не выходит... Помогите, если нетрудно Дана...

Не пойму как работает While
n = 4 a = 1 i = 0 summa = 0 while i < n: summa += a a = a/-2 i += 1 # print(summa)

9
1099 / 661 / 397
Регистрация: 07.11.2015
Сообщений: 1,062
31.05.2018, 21:18 2
строка запроса http://xerox.never.test/qwerty/qwerty
В %{REQUEST_URI} будет /qwerty/qwerty
RewriteRule получает строку без начального / т.е. qwerty/qwerty это если htaccess лежит в корне сайта.
Как на самом деле работает mod_rewrite

RewriteRule ^(.*)res?(.*)$ для совпадения шаблона в проверяемой строке должно быть re.
В твоём запросе есть только rt вот поэтому и нет совпадения с шаблоном. https://regex101.com/r/aZE1Q9/1
0
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
31.05.2018, 21:29  [ТС] 3
Извиняюсь. я чуток там ошибся.

строка запроса xerox.never.test/resources/qwerty
выражение RewriteCond %{REQUEST_URI} ^.*/.*res+.*$ не срабатывает.
выражение RewriteRule ^(.*)re?(.*)$ project/index.php [NC,L] работает
выражение RewriteRule ^(.*)res?(.*)$ project/index.php [NC,L] не работает

Если строка запроса xerox.never.test/qwerty/qwerty
Выражение RewriteCond %{REQUEST_URI} ^.*/.*r+.*e+.*$ срабатывает.
Выражение RewriteCond %{REQUEST_URI} ^.*/.*qwerty+.*$ не срабатывает.
выражение RewriteRule ^(.*)re?(.*)$ project/index.php [NC,L] работает
выражение RewriteRule ^(.*)res?(.*)$ project/index.php [NC,L] не работает

Сижу методом тыка ставлю и ничего понять не могу. Уже голова кругом идет от этого
0
1099 / 661 / 397
Регистрация: 07.11.2015
Сообщений: 1,062
31.05.2018, 21:43 4
А сам файл htaccess в корне сайта или в папке /resources/.
И есть ли в htaccess другие правила.
0
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
31.05.2018, 21:56  [ТС] 5
Вот структура снимок во вложении. .htaccess в корне сайта

Строка запроса xerox.never.test/resources/qwerty

Из того что я понимаю. (только что перепроверил)
в %{THE_REQUEST} есть ^.*resources/qwerty.*$
в %{REQUEST_URI} есть ^.{16,18}$
в %{REQUEST_URI} есть ^.*/.*r+.*e+.*$
в %{REQUEST_URI} нету ^.*/.*r+.*e+.*s+.*$
в %{REQUEST_URI} нету ^.*re.*$

RewriteRule ^(.*)re?(.*)$ project/index.php [NC,L] - Работает
RewriteRule ^(.*)res?(.*)$ project/index.php [NC,L] - Не работает (Естественно предыдущие варианты в комент бросаю)
Миниатюры
Не пойму как работает RewriteCond и RewriteRule  
0
1099 / 661 / 397
Регистрация: 07.11.2015
Сообщений: 1,062
31.05.2018, 22:39 6
Подвох в том что mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться. И флаг [L] не может это остановить.
В той статье про работу mod_rewrite это подробно расписано:
При составлении более-менее сложных конфигураций mod_rewrite важно понимать, что изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.

Apache поступает так, потому что в процессе изменения запроса он мог быть перенаправлен в другую директорию. В ней может быть собственный .htaccess, который не участвовал в предыдущей обработке запроса. В этом же новом .htaccess могут быть правила, которые влияют на обработку запроса — как правила mod_rewrite, так и правила других модулей. Чтобы корректно обработать эту ситуацию, Apache должен запустить весь цикл обработки заново.
Т.е. после того как сработал первый RewriteRule и поменял запрос на project/index.php обработка начинается заново с начала .htaccess
И вот там срабатывает второй RewriteRule и меняет запрос на xerox/index.php и обработка начинается заново с начала .htaccess

Строка /xerox/index.php совпадает с шаблонами
^.{16,18}$ https://regex101.com/r/aZE1Q9/2
^.*/.*r+.*e+.*$ https://regex101.com/r/aZE1Q9/3
^(.*)re?(.*)$ https://regex101.com/r/aZE1Q9/4

А вот с ^(.*)res?(.*)$ уже не совпадает https://regex101.com/r/aZE1Q9/5.

Опиши подробнее задачу и тебе помогут составить список правил.
1
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
31.05.2018, 22:55  [ТС] 7
В общем на хостинге все поддомены обрабатываются как и основной домен.
Задача такая.
Запрос xerox.never.test/page (любая страница с этого поддомена) - всегда начинал со скрипта в папке xerox/index.php
Запрос project.never.test/page (любая страница с этого поддомена) - всегда начинал со скрипта в папке project/index.php
Запрос never.test/page (любая страница с основного домена) - всегда начинал со скрипта в папке index.php

Далее
запрос на файлы из папки xerox/resources (css, java, картинки) если они существуют (флаг -s насколько я помню) отдавались пользователю.
К примеру xerox.never.test/resources/img/project-logo.png отдавалось из xerox/resources/img/project-logo.png
К примеру project.never.test/resources/img/project-logo.png отдавалось из project/resources/img/project-logo.png
К примеру never.test/resources/img/project-logo.png отдавалось из public/resources/img/project-logo.png

Ну в самом конце если ни один поддомен не подошел (ошибочный ввели то [R=404,L]).

Мой идеальный вариант был таким.
Миниатюры
Не пойму как работает RewriteCond и RewriteRule  
0
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
31.05.2018, 23:01  [ТС] 8
p.s. Надо переварить про зацикливание. Теперь мне кажется что я захотел что-то слишком сложное ))
Спасибо за разъяснение, впервые увидел про "запускает обработку запроса снова и снова"
0
1099 / 661 / 397
Регистрация: 07.11.2015
Сообщений: 1,062
01.06.2018, 05:39 9
Лучший ответ Сообщение было отмечено Neverov как решение

Решение

Остановить зацикливание можно так:
Код
RewriteCond %{ENV:REDIRECT_STATUS} .
RewriteRule ^ - [L]
Переменная %{ENV:REDIRECT_STATUS} изначально пустая, но после первого же успешного внутреннего перенаправления там будет 200 (если сработало правило с [R=404,L], то и статус будет 404).

Т.к. имена поддоменов совпадают с именами папок, то можно сделать так:
RewriteCond %{SERVER_NAME} ^(xerox|project)\.never\.test$ - при успешном совпадении шаблона в переменной %1 будет сохранено имя поддомена.
Код
RewriteCond %{SERVER_NAME} ^(xerox|project)\.never\.test$
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule ^(resources/.*)$ %1/$1 [L]

RewriteCond %{SERVER_NAME} ^(xerox|project)\.never\.test$
RewriteRule ^ %1/index.php [L]

Кликните здесь для просмотра всего текста
Код
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} .
RewriteRule ^ - [L]


RewriteCond %{SERVER_NAME} ^(xerox|project)\.never\.test$
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule ^(resources/.*)$ %1/$1 [L]

RewriteCond %{SERVER_NAME} ^(xerox|project)\.never\.test$
RewriteRule ^ %1/index.php [L]


RewriteCond %{SERVER_NAME} ^never\.test$
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(resources/.*)$ %1/$1 [L]

RewriteCond %{SERVER_NAME} ^never\.test$
RewriteRule ^ index.php [L]


RewriteRule ^ - [R=404,L]
1
0 / 0 / 0
Регистрация: 24.01.2018
Сообщений: 12
01.06.2018, 06:43  [ТС] 10
Emilien, Спасибо тебе огромное.
0
01.06.2018, 06:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2018, 06:43
Помогаю со студенческими работами здесь

Не пойму как работает
В учебнике дан пример рекурсии. Вывод цифр целого положительного числа в обратном порядке: var...

Не пойму как работает цикл
for(var i=1; i<9;i++){ document.write("Квадрат" + i + "равен" + i*i + "<br/>"); } ...

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

Не пойму как работает char
Выдает не символ, а сивол и число!!Это я уже пробую явное приведение. Кто поопытней, поясните!!...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru