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

Как создать два RewriteRule?

17.08.2018, 21:56. Показов 2067. Ответов 14

Author24 — интернет-сервис помощи студентам
Есть htaccess, маршрутизация (роутинг)

Bash
1
2
3
4
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]

Нужно сделать точно такую же, только для страницы contact.php. Я создаю так:

Bash
1
2
3
4
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ contact.php?id=$2 [L,QSA]

Но почему-то второй не срабатывает, а действия повторяются как у первого. То есть, после перехода на страницу contact/id/10 открывается index/id/10. Как объединить эти два варианта?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2018, 21:56
Ответы с готовыми решениями:

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

неполучается создать правило RewriteRule
хочу сделать ЧПУ но ничего не выходит вот что я использую RewriteRule ^(+)/(+)/?$...

Не пойму как работает RewriteCond и RewriteRule
Вот код из htaccess AddDefaultCharset utf-8 DirectorySlash Off RewriteEngine On Options...

RewriteRule - Как исправить ошибку, якобы вызова папки?
RewriteEngine on RewriteRule ^user/(+)$ profile.php?id=$1 Проблема такая. Когда захожу по...

14
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.08.2018, 00:13 2
https://habr.com/company/sprinthost/blog/129560/
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 10:16  [ТС] 3
Jewbacabra, можно конкретный пример привести?

Добавлено через 30 минут
Jewbacabra, я долго разбирался, в конечном итоге не получилось. Можно привести пример, как будет выглядеть два rewrite?
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 11:43 4
NormalThread, регулярные выражения в правилах-то должны отличать или нужны какие-то условия, вносящие различие. Из двух по сути одинаковых правил, конечно, будет работать первое. Это настолько просто, что тут нечего понимать. Лучше объясните, зачем вам вообще понадобились две точки входа.
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 11:47  [ТС] 5
Phantom-84, чтобы можно было открыть открыть как "example.com/index/id/10", так и "example.com/contact/id/10"
Можно было использовать стандартный GET запрос, но выглядит намного лучше такой прием роутинга. Я в apache, в частности htaccess ноль, поэтому и обратился сюда. Читал документации, там есть способы реализации, но только в единичном случае, а мне нужно два запроса на разных страницах, а нигде такого нет
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 12:07 6
Вторая точка входа вам для этого не нужна. Вы можете все делать в одной. В частности подключать нужный код в зависимости от адреса, типа запроса и т.п. Я бы даже вот это убрал: ?id=$1, потому что получить путь программным путем не составляет никакого труда. Причем он будет получен в исходном виде, без тех преобразований, которые претерпевают значения массива $_GET.

Добавлено через 5 минут
Но если вы склоняетесь к старой школе, используйте разные регулярные выражения в правилах, как я выше написал, например:
^index/
^contact/

Добавлено через 2 минуты
Можно объединить:
^(index|contact)/ - в этом случае имя будет первым параметром для подстановки.
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 12:07  [ТС] 7
Phantom-84, то есть вот так?
Bash
1
2
RewriteRule ^index/ index.php?id=$1 [L,QSA]
RewriteRule ^contact/ contact.php?id=$2 [L,QSA]
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 12:11 8
К предыдущему сообщению. А ко всему пути (без ведущего слеша) вы можете обращаться при помощи $0, например.

Добавлено через 1 минуту
Цитата Сообщение от NormalThread Посмотреть сообщение
то есть вот так?
Не совсем. Изучите основы. Также будет полезна ссылка, оставленная Jewbacabra.
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 12:23  [ТС] 9
Phantom-84, можно примерно составить? Я знаю, что это не сложно, но я не втыкаю

Добавлено через 11 минут
Jewbacabra, я знаю, что это не сложно, но я лично ноль в Apache, есть минута свободная?
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 12:25 10
Я на форуме никому ничего не составляю. Тем более что мне достаточно неприятно смотреть на подобные конструкции в .htaccess. У вас откровенная ошибка с $2. Да и вообще с параметрами, т.к. для них не заданы прототипы. Без прототипа можно использовать только $0.
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 12:30  [ТС] 11
Phantom-84, хорошо, допустим:

Bash
1
2
RewriteRule ^index/ index.php?id=$0 [L,QSA]
RewriteRule ^contact/ contact.php?id=$0 [L,QSA]
Можно конкретно показать где здесь ошибки? Я новичок в htaccess, поэтому не знаю, как и что реализовать лучше. Всегда использовал максимум одну конструкцию, поэтому достаточно было и одного RewriteRule, но сейчас нужно более одного и как конкретно сделать не знаю
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 12:35 12
Так уже лучше. Я надеюсь, после написанного мной вы уже понимаете, что в id попадет не 10, а весь путь (без ведущего слеша).
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 13:00  [ТС] 13
Phantom-84, да, я отделяю это функцией explode()
Вопрос заключается не в этом, а в том, правильная ли реализация двойного роутинга?

Еще не по теме, но по какой-то причине ajax запросы не отправляются, причина неизвестна, нигде про это не написано конкретно

Добавлено через 14 минут
Phantom-84, и еще при попытке вывести $_GET['id'] он выводит просто то, что находится в диапазоне от "RewriteRule ^" до "/ ", то есть, при попытке зайти на "example.com/index/id/10" он выводит "index/" и при "example.com/contact/id/10" выводит "contact/"
0
350 / 294 / 71
Регистрация: 15.09.2017
Сообщений: 1,305
18.08.2018, 13:14 14
Лучший ответ Сообщение было отмечено NormalThread как решение

Решение

Нет, не правильная. Вы частично выполняете одну и ту же работу дважды. Сначала в .htaccess, потом в выбранной точке. Передавайте в id хотя бы "id/10", если, конечно, ваши обработчики не настолько универсальны, что могут спокойно использоваться и в других ветвях сайта. Последнее впрочем не оправдывает двойную работу, а вновь говорит о неправильном разделении роутинга.

Цитата Сообщение от NormalThread Посмотреть сообщение
какой-то причине ajax запросы не отправляются
Таких причин нет, если используется клиент, способный это делать.

Добавлено через 8 минут
Цитата Сообщение от NormalThread Посмотреть сообщение
и еще при попытке вывести $_GET['id']...
Значит, я не совсем правильно понял написанное в документации:
$0 provides access to the whole string matched by that pattern.
Попробуйте добавить к выражению .* или .*$, хотя "незакрытое" выражение по идее это и должно обозначать.
0
2 / 2 / 1
Регистрация: 12.08.2017
Сообщений: 110
18.08.2018, 13:30  [ТС] 15
Phantom-84, да, все работает, сейчас посмотрю как будет в два варианта

Добавлено через 11 минут
Phantom-84, отлично, все работает как надо! Очень помогло! Благодарю!
Однако остается вопрос с ajax и почему он не передает данные php именно с той страницы, где были изменения RewriteRule, но это в другой теме
0
18.08.2018, 13:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2018, 13:30
Помогаю со студенческими работами здесь

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

Как создать сеть из 1с на два компа???
Всем привет помогите плиз как сделать так чтоб к одной проге 1с имели доступ с двух компьютеров????...

Как создать два потока в TCP
Привет всем, с наступающим всех)). Как создать два потока в TCP??? тоесть один поток отправляет...

Как создать два условия для Button
помогите разобраться. мне необходимо создать два условия при нажатии кнопки. 1 усл. если...


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

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