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

Чпу, mod_rewrite и .htaccess

07.10.2013, 18:34. Показов 6892. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наворотил делов так что вчера сайт вообще не отвечал, из-за условий в файле .htaccess он попадал в цикличность и выдавал сообщение "состояние перенаправления". На данный момент от цикличности избавился, дописал ещё несколько условий и теперь я опять в ступоре.

Надо преобразовать адрес anekdoty-date.php?date=07.10.2013&page=2 в anekdoty/date/07.10.2013/page/2.

Пробовал сделать так:
PHP
1
RewriteRule ^anekdoty/date/(.*)/post/(.*)$ anekdoty-date.php?date=$1&page=$2 [L]
В файле уже есть несколько условий, возможно составленных не правильно. Потому что при таком запросе меня перебрасывает на другой файл обработчик а не на anekdoty-date.php

Буду признателен за любую помощь и советы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2013, 18:34
Ответы с готовыми решениями:

ЧПУ htaccess и mod_rewrite?
Всем доброго для! Кто может помогите разобраться с проблемой. Перечитал много тем а решения так и не нашел. Вот пример ссылки на...

Mod_rewrite и ЧПУ
Всем привет. Уже 2-ой день мучаюсь над реализацией ЧПУ для своего сайта. Хочу реализовать это дело через mod_rewrite. На локальной машине...

mod_rewrite ЧПУ
Приветствую. Понимая, что подобных тем тьма, не хотел создавать новую но времени у меня нет особо чтоб рыскать ответ на мой вопрос, с...

68
0 / 0 / 0
Регистрация: 11.11.2013
Сообщений: 3
11.11.2013, 23:45
Студворк — интернет-сервис помощи студентам
есть очень простой тест в Гугле:
site:site.com
site:site.com/
так вот, поисковик выдает разное число страниц

Добавлено через 4 минуты
Цитата Сообщение от z-17 Посмотреть сообщение
Ale-x3, это бред, а не дубли страниц.
Если вы сеошник, то должны понимать что поисковики не такие тупые, и если уж они способны склеить домены www.site.ru и site.ru, то проблем со слешем уж точно не будет.

Программисты не воспринимают site.com и site.com/ как один, а это и есть один. И поисковики пишут эти самые программисты.
а для склеивания www.site.ru и site.ru специально прописывается директива в htaccess, ибо поисковики как раз тупые, и для них это разные домены!
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
21.11.2013, 23:51  [ТС]
Товарищи, я снова вернулся за помощью

В файле .htaccess есть правила которые судя по всему мешают друг другу. Вот эти правила.

Code
1
2
RewriteRule ^interesnye-fakty/page/(.+)$ interesnye-fakty.php?page=$1 [L]
RewriteRule ^interesnye-fakty/(.*)$ interesnye-fakty-post.php?id=$1 [L]
Сначала у меня было добавлено только одно (первое) правило для "пейджинга" и всё нормально работало. После этого я добавил другое правило в котором хочется реализовать ЧПУ. В текущем состоянии оно работает, но теперь при переходе на вторую страницу interesnye-fakty/page/2 у меня появляется ошибка 404, которая срабатывает из-за этого правила.

Code
1
ErrorDocument 404 http://мой_сайт.ru/error404.php
Можно ли как-то изменить конструкцию что бы одновременно работало и ЧПУ для отдельных статей и "пейджинг" для просмотра анонсов? Заранее благодарю за ответы и любую помощь.

Добавлено через 46 минут
Цитата Сообщение от by-bad Посмотреть сообщение
Заранее благодарю за ответы и любую помощь.
Решение найдено.

Вместо любого символа неограниченное кол-во раз (.*) использовал только цифры ([0-9]+) - вроде работает.
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
28.11.2013, 23:22  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
RewriteCond %{QUERY_STRING} ^search=([^/]+?)/page/(\d+?)/?$ [NC]
RewriteRule . anekdoty-search.php?search=%1&page=%2
KOPOJI, благодаря вам сейчас у меня получается пользоваться ссылкой вида anekdoty/search/?search=%ED%E0%20%FE%E3%E5/page/2

Но теперь я столкнулся с другой проблемой. Если вручную на конце "пейджера" добавить какие-нибудь символы, например anekdoty/search/?search=%ED%E0%20%FE%E3%E5/page/2sdfg, вся конструкция рушится. По идее, в таком случае должна была бы появиться ошибка 404 которая прописана так

MySQL
1
ErrorDocument 404 http:// мой_сайт.ru /error404.php
Но она не появляется, а при переходе на вторую страницу у меня получается

...%ED%E0%20%FE%E3%E5/page/2sdfg/page/2

Как сделать так, что бы на конце было разрешено использовать только цифры? Пробовал подставить ([0-9]+) вместо (\d+?) - меня перекидывает на первую страницу, и в "пейджере" сохраняется вся белиберда которую я дописывал к запросу. Это можно как-то исправить?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 18:40
вообще такого не должно быть. ^ означает начало строки, $ означает конец строки..
Даже не знаю, попробуйте так..
Code
1
RewriteCond %{QUERY_STRING} ^search=([^/]+?)/page/(\d+?)(?!\D)/?$ [NC]
Правда, не знаю, поддерживаются ли такие условия в mod_rewrite
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 19:02  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
попробуйте так..
Попробовал - аналогично. В целом мне надо как-то ограничить использование любых символов кроме цифр и тогда всё станет на свои места - цифры это номера страниц, а если кто-то допишет к ним что-то, появится ошибка 404. Но как сделать что бы можно было использовать только цифры?!

Почему на конце стоит слеш? И что означает вопросительный знак после него?

Цитата Сообщение от KOPOJI Посмотреть сообщение
/page/(\d+?)(?!\D)/?$ [NC]
У меня урл заканчивается так /page/2 - без слеша.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 19:07
слэш со знаком вопроса - "или есть слэш, или его нет"
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 19:10  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
слэш со знаком вопроса - "или есть слэш, или его нет"
Ок, а как всё таки сделать что бы на конце можно было использовать только цифры?
Я пробовал подставить ([0-9]+) вместо (\d+?), но если я дописываю чего-нибудь кроме цифр - ничего не происходит.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 19:14
Цитата Сообщение от by-bad Посмотреть сообщение
Но как сделать что бы можно было использовать только цифры?!
сама по себе, регулярка верная (почти, со слэшем я чуть промахнулся)..
А попробуйте от обратного:
Code
1
2
RewriteCond %{QUERY_STRING} ^search=([^/]+?)/page/(\d+?)[^\d]+?$
RewriteRule . /error.php [R=301,L]
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 20:06  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
А попробуйте от обратного:
Попробовал - при переходе по ссылке на вторую страницу у меня появляется первая, а в урле всё дублируется /page/2/page/2/page/2. Хм...
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 20:19
Не может быть. Редирект сделали на страницу с ошибкой..?
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 20:22  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Редирект сделали на страницу с ошибкой..?
Так не подойдёт ?
MySQL
1
ErrorDocument 404 http:// мой_сайт.ru /error404.php
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 20:24
Нет. Имелось в виду в rewriterule, вместо "/error.php"
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 20:29  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Не может быть. Редирект сделали на страницу с ошибкой..?
Ну я скопировал предложенный вами код
Цитата Сообщение от KOPOJI Посмотреть сообщение
RewriteCond %{QUERY_STRING} ^search=([^/]+?)/page/(\d+?)[^\d]+?$
RewriteRule . /error.php [R=301,L]
В данном случае всё так как я уже и говорил.
Цитата Сообщение от by-bad Посмотреть сообщение
Попробовал - при переходе по ссылке на вторую страницу у меня появляется первая, а в урле всё дублируется /page/2/page/2/page/2
Добавлено через 30 секунд
На страницу с ошибкой не перебрасывает!
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.11.2013, 20:36
значит, не срабатывает.. я не знаю, как это исправить через .htaccess, с GET-параметрами особо не работал.. Все, что я могу подсказать - проверять в самом скрипте, на пыхе. Как-то так
PHP
1
2
3
4
5
if(!preg_match('~^\\d+?$~', $_GET['page']))
{
    header('Location: /error404.php');
    exit;
}
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
29.11.2013, 20:37  [ТС]
Что-то мы с вами как-то не в ту степь вообще пошли, мне так кажется.
С помощью вашего предыдущего варианта
MySQL
1
2
RewriteCond %{QUERY_STRING} ^search=([^/]+?)/page/(\d+?)/?$ [NC]
RewriteRule . interesnye-fakty-search.php?search=%1&page=%2
У меня всё работает как надо, т.е. я могу перейти по ссылке .../interesnye-fakty/search/?search=%ED%E0%20%FE%E3%E5 или .../interesnye-fakty/search/?search=%ED%E0%20%FE%E3%E5/page/2 на вторую страницу результатов поиска.

Но теперь, надо как-то "ограничить" написание страниц - что бы там были только цифры. Например, если пользователь самостоятельно добавил к номеру страницы какие-нибудь символы, должна появиться страница с ошибкой 404 которая прописана как ErrorDocument. ...FE%E3%E5/page/2dfghls - должна появиться страница с ошибкой, а у меня открывается первая страница результатов поиска, а в урлах для пейджера появляется /page/2dfghls/page/2

Тоже самое я сделал для других страниц, но без RewriteCond. Вот пример:

MySQL
1
RewriteRule ^interesnye-fakty/date/([^/]+?)/page/([0-9]+)$ interesnye-fakty-date.php?date=$1&page=$2 [L]
Так на конце урла может быть только цифра. Если дописать что-то в конце - перебрасывает на ошибку, как и должно быть. В общем я уже совсем запутался, надеюсь на Вашу квалифицированную помощь.
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
02.12.2013, 23:05  [ТС]
Цитата Сообщение от KOPOJI
это правило просто попадает под другое.
Возможно что так и есть, понимаю что я многого хочу, но не могли бы вы взглянуть на мои правила?
Может вы ошибку сразу увидите...

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
RewriteEngine on
Options +FollowSymlinks
Options -MultiViews
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^interesnye-fakty$ interesnye-fakty.php [L]
RewriteRule ^interesnye-fakty/([0-9]+)$ interesnye-fakty-post.php?id=$1 [L]
RewriteRule ^interesnye-fakty-ne-najdeny$ interesnye-fakty-ne-najdeny.php [L]
RewriteRule ^interesnye-fakty/page/([0-9]+)$ interesnye-fakty.php?page=$1 [L]
RewriteRule ^interesnye-fakty-otpravit-kommentarij$ interesnye-fakty-otpravit-kommentarij.php [L]
RewriteRule ^interesnye-fakty/date/([0-9-.]+)$ interesnye-fakty-date.php?date=$1 [L]
RewriteRule ^interesnye-fakty/date/([^/]+?)/page/([0-9]+)$ interesnye-fakty-date.php?date=$1&page=$2 [L]
RewriteRule ^interesnye-fakty/search/$ interesnye-fakty-search.php [L]
RewriteCond %{QUERY_STRING} ^fakty=([^/]+?)/page/(\d+?)$ [NC]
RewriteRule . interesnye-fakty-search.php?fakty=%1&page=%2 [L]
 
RewriteRule ^interesnye-fakty/tag/([0-9a-z-]+)$ interesnye-fakty-tags.php?tag=$1 [L]
RewriteRule ^interesnye-fakty/tag/(.*)/page/([0-9]+)$ interesnye-fakty-tags.php?tag=$1&page=$2 [L]
 
ErrorDocument 404 [url]http://moi_site.ru/error404.php[/url]

К примеру, interesnye-fakty-date.php?date=14.11.2013&page=2 с помощью правила из 13-ой строки обрабатывается так как надо - пейджер работает на ура и всё остальное, правда дата передаётся через _POST.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.12.2013, 23:15
Кажется, я понял, в чем проблема
by-bad, а если в строке вбивать не interesnye-fakty?search=.... а, к примеру, вот так:
interesnye-fakt?search=... (без одной буквы, ну или изменить на любое другое название, отличное от имени файла)
Попробуйте, и отпишитесь о результатах
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
02.12.2013, 23:28  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Попробуйте, и отпишитесь о результатах
Вы сейчас хотите что бы я ссылки без ЧПУ проверил?
Зашёл так .../interesnye-fakty-search.php?fakty=%ED%E0+%FE%E3%E5 всё работает как надо (без ЧПУ).
Так тоже всё отлично .../interesnye-fakty-search.php?fakty=%ED%E0+%FE%E3%E5&page=2 с пейджером (без ЧПУ).
Попробовал удалить букву перед переменной, как вы посоветовали - появляется ошибка 404 (ErrorDocument 404)

Далее попробовал с теми правилами которые прописаны и на ссылках с ЧПУ.
Зашёл так: .../interesnye-fakt/search/?fakty=%ED%E0+%FE%E3%E5 (удалил букву как вы попросили) - появилась ошибка 404.

Или я что-то не то делаю?

Добавлено через 4 минуты
PS: у меня вместо ?search форма передаёт ?fakty, поэтому у меня немножко иначе, но суть та же.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.12.2013, 23:31
Нет. Перейдите по адресу http://site.ru/interesnye-fakt?search=foo/page/2 и http://site.ru/interesnye-fakt?search=foo/page/2f
Что получаете в первом и во втором случае?
0
1 / 1 / 0
Регистрация: 07.10.2013
Сообщений: 117
02.12.2013, 23:48  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Что получаете в первом и во втором случае?
В обоих случаях редирект на ошибку 404 (ErrorDocument 404).
Но мне кажется чего-то в урле не хватает... или расширения .php или слеша.

Добавлено через 1 минуту
Ссылка без ЧПУ выглядит так: interesnye-fakty-search.php?fakty=%ED%E0+%FE%E3%E5&page=2
Ссылка с ЧПУ выглядит так: /interesnye-fakty/search/?fakty=%ED%E0+%FE%E3%E5/page/2

Добавлено через 10 минут
Цитата Сообщение от KOPOJI Посмотреть сообщение
Перейдите по адресу http://site.ru/interesnye-fakt?search=foo/page/2
Обработчик поиска не interesnye-faktу.php а interesnye-fakty-search.php, если вы намекаете на то что у меня открывается первый файл, то нет - там мета данные другие, title и всё такое - разница была бы заметна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2013, 23:48
Помогаю со студенческими работами здесь

Настройка mod_rewrite (ЧПУ)
имеется сайт на котором нужно сделать ЧПУ на htaccess страницы имеют вид http://mysyte.ru/page.php?title_url=mypage&id=30 первую...

Не работает ЧПУ (mod_rewrite)
Уже голову себе сломал. Есть такая ссылка: <a href="/category/23">Категория с id=23</a> Теперь условие в .htaccess RewriteEngine on ...

Проблемы с настройкой ЧПУ в mod_rewrite
Уже не первый День и не первый раз пытаюсь осилить это ВЕЛИКОЛЕПНЫЙ модуль, но походу без посторонней помощи, более опытных специалистов...

Реализация ЧПУ на сайте (mod_rewrite)
Всем доброго времени суток. В общем, не хватает нервов уже на этот mod_rewrite и htaccess,поэтому пишу сюда. Подскажите,как правильно...

mod_rewrite - как сделать ЧПУ?
Как через ф-цию mod_rewrite сделать ЧПУ?


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru