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

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

Автор: Cheery
Дата сообщения: 04.05.2009 19:41
DarkSmoke

Цитата:
Может кто разжует мне?

разжеванная кашица была уже не раз в этой теме - просмотрите ее
Автор: SiMM
Дата сообщения: 05.05.2009 14:25

Цитата:
Полная документация, но мне показалась сухой, мало полезных и главное наглядных примеров
Потому что ссылку надо давать правильную
http://www.egoroff.spb.ru/portfolio/apache/

Цитата:
плагин к IE для просмотра DjVu-файлов
Смотреть DjVu плагином от IE - мазохизм
WinDjView
Автор: alex_zin
Дата сообщения: 06.05.2009 12:46
Отличные статьи, чтобы начать разбираться в теме:

_http://www.addedbytes.com/apache/url-rewriting-for-beginners/
_http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/
Автор: dikeyfd
Дата сообщения: 06.05.2009 13:33
Что-то никак не соображу...

Есть хостинг megahoster.msk.ru

на него есть куча алиасов:
vasia.msk.ru/
masha.msk.ru/
glasha.msk.ru/

как в .htaccess прописать ссыли на соотв. каталоги

/vasia/
/masha/
/glasha/
/megahoster/

при этом не подменяя строку в браузере
Автор: alex_zin
Дата сообщения: 06.05.2009 16:40
никак не могу понять можно ли это сделать проще:

есть www.host.com/index.php?param1=value1&param2=value2...
хочу www.host.com/categories/index_param1_value1_param2_value2....html
всего максимальное значение параметров - 6.

Решил пока отдельным RewriteRule для каждого набора (1,2,3,4,5,6) параметров вот так:

Код:
RewriteRule ^categories/index_([a-zA-Z]+)_([0-9]+)\.html$ index.php?$1=$2 [L]
RewriteRule ^categories/index_([a-zA-Z]+)_([0-9]+)_([a-zA-Z]+)_([0-9]+)\.html$ index.php?$1=$2&$3=$4 [L]
RewriteRule ^categories/index_([a-zA-Z]+)_([0-9]+)_([a-zA-Z]+)_([0-9]+)_([a-zA-Z]+)_([0-9]+)\.html$ index.php?$1=$2&$3=$4&$5=$6 [L]
#и так далее для 6 параметров..
Автор: dacuan
Дата сообщения: 08.05.2009 15:17
alex_zin
Я бы сделал так:

Код: RewriteRule ^categories/index_(([a-zA-Z]+)_([0-9]+))+\.html$ index.php?opts=$1 \[L\]
Автор: alex_zin
Дата сообщения: 08.05.2009 19:05
dacuan
Спасибо за совет, подумаю, решение действительно эффективное.

Вот альтернативный вариант решения, до какого я пока додумался

Код:
RewriteRule (.*)_([a-zA-Z]+)_([0-9\-]+)([a-zA-Z0-9=\-&]*)\.html$ $1&$2=$3$4.\html [N]
RewriteRule ^([a-zA-Z]+)&(.*)\.html $1.php?$2
Автор: ra1n
Дата сообщения: 14.05.2009 21:58
А как орагнизовать редирект покрасивее?

Нужны простые, жесткие правила.

Пример
С ссылки вида

Код: http://www.site.ru/index.php?page=23&langid=0
Автор: Cheery
Дата сообщения: 14.05.2009 22:00
ra1n
www.php.net/header
вот и добавляете в самом index.php, к примеру
Автор: ra1n
Дата сообщения: 14.05.2009 22:04
Cheery
а используя .htaccess нельзя?
Автор: Cheery
Дата сообщения: 14.05.2009 22:13
ra1n

Цитата:
а используя .htaccess нельзя?

можно, но вы не показали специфики
проброс именно с такими параметрами? или что?
Автор: ra1n
Дата сообщения: 14.05.2009 22:16
Да по сути всё просто.
Параметры не надо передавать.
Отличие идет по "?page=**"
Если page=1, кидаем на pageA
если page=11, кидаем на pageB

Несколько жестких правил...
Автор: Cheery
Дата сообщения: 14.05.2009 22:31
ra1n
RewriteCond %{QUERY_STRING} page=1$
RewriteRule .*$ /pageA [L]
RewriteCond %{QUERY_STRING} page=11$
RewriteRule .*$ /pageB [L]

но есть свои неудобства.. в частности при такой записи - там больше ничего не должно быть.
но если убрать $, то 1 и 11 - одно и то же..
в смысле что при 11 - 1 сработает раньше

можно попробовать так
RewriteCond %{QUERY_STRING} page=1[^0-9]?
RewriteRule .*$ /pageA [L]
RewriteCond %{QUERY_STRING} page=11[^0-9]?
RewriteRule .*$ /pageB [L]
Автор: ra1n
Дата сообщения: 14.05.2009 22:35
Не работает что то...

Вот как целиком файл выглядит

Код: RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html
php_value error_reporting 7
ErrorDocument 404 /pages.php

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} page=23$
RewriteRule .*$ /pageA [L]
Автор: Cheery
Дата сообщения: 14.05.2009 22:36
ra1n
я же написал в чем может быть дело
Автор: ra1n
Дата сообщения: 14.05.2009 22:40
ой, сразу изменений не заметил

Добавлено:
не пойму, как
Цитата:
page=1[^0-9]?
может указать на
Цитата:
/index.php?page=1&langid=0

Автор: Cheery
Дата сообщения: 14.05.2009 22:45
ra1n

Цитата:
может указать на

почитайте, что такое QUERY_STRING и про регулярные выражения
Автор: wyxa
Дата сообщения: 05.06.2009 01:21
Настроил mod_rewrite, теперь ссылки на сайт сделаны в виде:
httр://домен/папка1/папка2/.../папкаN/файл
(без расширения, и без / на конце).
также может быть так: httр://домен/папка1/папка2/.../папкаN/

Но некоторые браузеры (среди них IE 6) запоминают ссылку
httр://домен/папка1/папка2/
в виде
httр://домен/папка1/папка2
(без / на конце)

Тогда «папка2» интерпретируется как файл, и выскакивает ошибка 404.

Вопрос: Можно ли как-то настроить .htaccess так, чтобы он проверял существует ли адрес
httр://домен/папка1/папка2
и если такого нет, попробовал
httр://домен/папка1/папка2/

Вот что у меня в [more=.htaccess]
RewriteRule ^(ru|en)/([A-Za-z_]+)/$                    index.php?l=$1&a=$2
RewriteRule ^(ru|en)/([A-Za-z_]+)/([A-Za-z_]+)/$            index.php?l=$1&a=$2&b=$3
RewriteRule ^(ru|en)/([A-Za-z_]+)/([A-Za-z_\.\(\)-]*)$            index.php?l=$1&a=$2&id=$3
RewriteRule ^(ru|en)/([A-Za-z_]+)/([A-Za-z_]+)/([A-Za-z_\.\(\)-]*)$    index.php?l=$1&a=$2&b=$3&id=$4
[/more]
Автор: Cheery
Дата сообщения: 05.06.2009 01:24
wyxa

Цитата:
Вопрос: Можно ли как-то настроить .htaccess так, чтобы он проверял существует ли адрес

включите в конфиге апача mod_dir
http://httpd.apache.org/docs/2.0/mod/mod_dir.html
Автор: wyxa
Дата сообщения: 05.06.2009 03:27
Cheery
mod_dir, вроде у меня включён. На существующие папки у меня / добавляется автоматом. А так как я перезаписываю mod_rewrite-ом, то папок в URL не существует.

.htaccess у меня примерно такой (сделал в виде таблицы для наглядности)
1 RewriteRule ^([A-Za-z_]+)/$ index.php?dir1=$1 #папка/
Автор: Cheery
Дата сообщения: 05.06.2009 03:30
wyxa

Цитата:
или в самом index.php пытаться отслеживать такие ситуации?

в нем.. у вас же фактические папки не по пути запроса расположены?
как сервер может узнать есть она или нет?
Автор: wyxa
Дата сообщения: 05.06.2009 03:55
Cheery
Ясно, спасибо!
А ещё такой вопрос. Мне нужно редиректом перенаправлять ссылки httр://домен/ru на httр://домен/ru/. Аналогично с en.

У меня правило:
RewriteRule    ^/(ru|en)$    /$1/    [R=301]
Почему оно не работает?

Ну, я ещё пытался так:
RewriteRule ^http://localhost/(ru|en)$    http://localhost/$1/ [R=301]
Тоже не пашет.
Автор: Cheery
Дата сообщения: 05.06.2009 04:08
wyxa

Цитата:
Тоже не пашет.

а с чего оно должно "пахать", если http и так далее туда не передается?

Цитата:
RewriteRule ^/(ru|en)$ /$1/ [R=301]

уверены, что до него вообще доходит выполнение? включите на время логгирование и посмотрите
и попробуйте без /
RewriteRule ^(ru|en)$ /$1/ [R=301]
Автор: wyxa
Дата сообщения: 05.06.2009 04:09
Поискал в инете, нашёл такую конструкцию:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [L,R=301]

Насколько я понимаю, первое условие проверяет наличие файла, если его нет, то добавляет / и затем перезаписывает. Если это не так, поправьте меня.

Добавлено:
Cheery
Нет,
RewriteRule ^(ru|en)$ /$1/ [R=301]
тоже не работает. Вылетает ошибка 404.
А с кодом выше вроде всё хорошо.
Автор: Cheery
Дата сообщения: 05.06.2009 04:12
wyxa

Цитата:
Насколько я понимаю, первое условие проверяет наличие файла, если его нет, то добавляет / и затем перезаписывает

я же сказал - у вас пути, к которым идет запрос, физически существуют там же или информация берется в index.php откуда то?
Автор: wyxa
Дата сообщения: 05.06.2009 04:19
Cheery
Физически пути не существуют. Всё виртуально. Есть только index.php.
/папка1/папка2/файл
преобразовывается в
/index.php?dir1=папка1&dir2=папка2&file=файл
и т. п. и информация берётся из базы.
Автор: Cheery
Дата сообщения: 05.06.2009 04:22
wyxa

Цитата:
Физически пути не существуют. Всё виртуально.

тогда каким образом в htaccess определится есть ли файл, который обрабатывается с помощью index.php?
поэтому передавайте что хочется в index.php, а уже там решайте как и куда отредиректить в случае чего.
Автор: wyxa
Дата сообщения: 05.06.2009 04:32
Cheery

Цитата:
тогда каким образом в htaccess определится есть ли файл, который обрабатывается с помощью index.php?

Я понял вашу мысль.
Дело в том, что виртуальных папок первого уровня (httр://домен/папка1/) у меня ограниченное количество: только /ru/ и /en/. Я их обрабатываю в самом htaccess. Если запрашивается что-то другое, то вылетает ошибка 404. Аналогично с файлами httр://домен/файл и httр://домен/папка1/файл. В данном случае я лишь добился того, чтобы не было ошибки 404.
В остальных ситуациях, конечно, только через index.php.

Спасибо!

Добавлено:

Можно ли при помощи mod_rewrite сделать следующее преобразование:
по запросу
httр://домен/папка/
изменить регистр первой буквы «папки»:
httр://домен/Папка/

?

Примеры:http://домен/gallery/ преобразовывается в http://домен/Gallery/
Автор: DrakonSoft
Дата сообщения: 20.06.2009 18:15
Надод, помогите плиз.

Все файлы, находящиеся в application брать из папки application,

при запросе файла из image/ отдавать файл из sites/хост/image
при запросе файла из media/ отдавать файл из sites/хост/media

Все остальные запросы передавать на move.php

Написал в .htaccess следующее.

RewriteRule ^application/(.*)$ application/$1 [L]
RewriteRule ^image/(.*)$ sites/%{HTTP_HOST}/image/$1 [L]
RewriteRule ^media/(.*)$ sites/%{HTTP_HOST}/media/$1 [L]

RewriteRule ^(.*)$ move.php [QSA]

Он при любом запросе (кроме application) все равно все передает на move.php
помогите решить проблему, плиз
Автор: Cheery
Дата сообщения: 20.06.2009 19:44
wyxa

Цитата:
т. е. взять URL и изменить регистр каждой буквы после / (кроме самого домена).

можно.. регулярные выражение, вообще то, регистрозависимы
только если указать потом [NC] сделает их независимыми

DrakonSoft

Цитата:
Он при любом запросе (кроме application) все равно все передает на move.php

.htaccess где расположен? в
Цитата:
sites/хост/image
тоже?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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