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

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

Автор: dacuan
Дата сообщения: 22.02.2008 16:05
Tonyas
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными. Так что придется искать другой путь передачи параметров, например, анализировать URL в скрипте.
Автор: Tonyas
Дата сообщения: 22.02.2008 16:15

Цитата:
Tonyas
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными. Так что придется искать другой путь передачи параметров, например, анализировать URL в скрипте.

я нашла на англоязычном форуме, что можна вот так реализовать


Цитата:
Nine parameters is the limit *per rewriterule*.
RewriteCond and rewriterule can each create nine back-references, %1-%9 and $1-$9 respectively.
You may be able to use chained rules, with the first rule doing part of the rewrite, and the second rule finishing the rest. See the the rewriterule [C] flag.
Your pattern can be re-written for much more efficient processing using a "one or more characters not equal to a slash" subpattern like this:

rewriterule ^([1-9]В¦1[01])/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^.]+)\.html$ temp/$6?lid=$1&$2=$3&$4=$5 [C]
rewriterule ^temp/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]*)\.html$ index.php?$1=$2&$3=$4&$5=$6 [QSA,L]

The temporary pathname 'temp' is arbitrary -- change it in both rules if you like.

но честно говоря ничего не вышло,а со скриптом отдельным для обработки больно проблематично получается.
Автор: dacuan
Дата сообщения: 22.02.2008 17:07
Tonyas


Цитата:
но честно говоря ничего не вышло,а со скриптом отдельным для обработки больно проблематично получается.

А как выглядело именно Ваше правило?

Автор: Tonyas
Дата сообщения: 22.02.2008 17:53
rewriterule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/l.gif$ temp/$6?a=$1&b=$2&c=$3&d=$4&e=$5 [C]
rewriterule ^temp/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/l.gif$ file.php?&f=$1&k=$2&l=$3&m=$4&n=$5&o=$6&p=$7 [QSA,L]
Автор: dacuan
Дата сообщения: 22.02.2008 18:15
Tonyas
А если так?

Код: rewriterule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/l.gif$ temp/$6?a=$1&b=$2&c=$3&d=$4&e=$5 [C]
rewriterule ^temp/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+) file.php?&f=$1&k=$2&l=$3&m=$4&n=$5&o=$6&p=$7 [QSA,L]
Автор: Tonyas
Дата сообщения: 22.02.2008 20:29
так тоже не работает
Автор: Cheery
Дата сообщения: 22.02.2008 20:40
Tonyas

Цитата:
так тоже не работает

передавайте в скрипт всю строку запроса и в нем разбивайте как вам будет удобнее
Автор: Delphi6
Дата сообщения: 22.02.2008 22:39
dacuan

Цитата:
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными.

А я даже не знал (правда никогда не приходилось столько параметров передавать).

Tonyas
А что если сделать пошаговую конвертацию? (конечно я бы предпочел метод предложенный Cheery) Ну допустим пропарсить часть урла и средирекнуть ([R=301,L]) да так что бы его потом заново поймало но уже второе правило, а оно уже в свою очередь допарсило бы все до конца ...
Автор: Delphi6
Дата сообщения: 23.02.2008 00:40
ой ... я только что заметил что вы нашли как раз такое решение (цитата на английском языке).
Автор: Tonyas
Дата сообщения: 23.02.2008 08:49
Ну вот оно вроде бы должно работать, но уже разными способами пробовала не работает. А где ошибка закралась не пойму.Мне не понятна папка темп, это туда сначала передается часть данных или как? Или это должна быть папка где лежат файлы для запроса. Со скриптом то можно сделать конечно, можно и постараться число переменных уменьшить, будет менее удобно, но что делать, но ведь должно как-то реализовываться с помощью mod_rewrite
Автор: Delphi6
Дата сообщения: 23.02.2008 13:57
Tonyas
А вот и рабочий вариант. Правда пришлось часок поэкспериментировать

Код: RewriteEngine On
RewriteBase /
RewriteRule ^folder/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/(.*)/l.gif$ temp/$8/?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7 [C]
RewriteRule ^temp/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/(.*)$ /ru-board/tonyas/file.php?h=$1&i=$2&j=$3&k=$4&l=$5 [QSA,L]
Автор: Tonyas
Дата сообщения: 23.02.2008 16:21
Работает. Спасибо большое. Просто огромное.
Автор: MaxTax
Дата сообщения: 02.03.2008 09:57
Помогите пожалуйста с проблемой! Переехал на новый хостинг и перестали работать некоторые инструкции mod_rewrite

Хотя на предыдущем и у меня на локале все работает, не могу понять в чем проблема

RewriteRule ^article/([0-9]+).html$ article.php?id=$1 [L] #не работает
RewriteRule ^print/([0-9]+).html$ print.php?id=$1 [L] #не работает
RewriteRule ^rss(/?)$ rss.php [L] #работает
RewriteRule ^arhiv(/?)$ arhiv.php [L] #работает
RewriteRule ^arhiv/p_([0-9]+).html$ arhiv.php?p=$1 [L] #не работает
RewriteRule ^([a-z]+)(/?)$ section.php?alias=$1 [L] #не работает
Автор: andead
Дата сообщения: 02.03.2008 17:02
MaxTax
попробуй в начала htaccess написать

Код: Options +FollowSymLinks -MultiViews
Автор: MaxTax
Дата сообщения: 02.03.2008 18:53
andead
Не помогло, и то что работало перестало обрабатываться
Автор: roma572
Дата сообщения: 18.03.2008 14:15
Хотел сделать простенький антилич, чтобы пользователи пришедшие только с одного сайта могли слить файл. Проверка на вшивость проводится по рефереру и куки.
Подскажите такое решение, чтобы пользователь, кликнув на ссылку с нужного сайта получал файл (с возможностью использовать менеджеры закачек), а с любого другого сайта или с пустого реферера получил бы 404.
Автор: Cheery
Дата сообщения: 18.03.2008 17:29
roma572

Цитата:
Подскажите такое решение, чтобы пользователь, кликнув на ссылку с нужного сайта получал файл (с возможностью использовать менеджеры закачек), а с любого другого сайта

любой менеджер закачек подставляет реферером ту папку, в которой лежит файл
например, без mod_rewrite

Код: SetEnvIfNoCase Referer ^http://site\.ru getout
<Directory ...>
Order deny,allow
Deny from all env=getout
Allow from all
</Directory>
Автор: karterfree
Дата сообщения: 24.03.2008 22:12
Такой вопрос. Есть .htaccess с содержанием:

------------------------------
DirectoryIndex index.php
Options -Indexes

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^tiket index.php?modul=tiket
RewriteRule ^tiket/(.*)$ index.php?modul=tiket&page=$1

RewriteRule ^news index.php?modul=news
RewriteRule ^news/(.*)$ index.php?modul=news&page=$1

RewriteRule ^docs index.php?modul=docs
RewriteRule ^docs/(.*)$ index.php?modul=docs&page=$1

RewriteRule ^guide index.php?modul=guide
RewriteRule ^guide/(.*)$ index.php?modul=guide&page=$1

RewriteRule ^files index.php?modul=files
RewriteRule ^files/(.*)$ index.php?modul=files&page=$1

RewriteRule ^mypage index.php?modul=mypage
RewriteRule ^mypage/(.*)$ index.php?modul=mypage&page=$1

ErrorDocument 404 /index.php?modul=404
ErrorDocument 403 /index.php?modul=403
----------------------------------------------------------

Такие правила были поставлены что бы ссылки
http://localost/tiket/ перенаправлялись на http://localost/index.php?modul=tiket

Но вот проблема:
У меня появился дополнительный модуль http://localost/techspec/
Лежит по адресу http://localost/techspec/index.php
но когда я иду по адресу http://localost/techspec/ то попадаю на http://localost/index.php

Как дописать или переписать правила что бы
http://localost/techspec/ перенаправлялся на http://localost/techspec/index.php (соответственно с сss и т.д.)
а http://localost/tiket/, http://localost/news/ и т.д. перенаправлялись на http://localost/index.php
Автор: Cheery
Дата сообщения: 24.03.2008 23:09
karterfree
добавить
RewriteCond %{REQUEST_URI} !^/techspec/
Автор: Pirates
Дата сообщения: 31.03.2008 01:30
Честно прочитал всю ветку, надеясь натолкнуться на решение своей проблемы. Вокруг да около разговоров много, но поскольку ни разу не программер, выжать для себя решение не смог. Перепробовав не один десяток вариантов, сдался и повторяю здесь свою просьбу, ранее опубликованную в соседней ветке:


В данный момент на домене http://domain.ru/ работает конструкция, которая при попытке вызова несуществующего урла (http://domain.ru/some.php, http://domain.ru/some.html, http://domain.ru/some/) скидывает на главную страницу:


Цитата:
RewriteEngine on
RewriteCond %{REQUEST_URI} \.shtml?$
RewriteRule ^(.*)\.shtml?$ $1.php [L]
RewriteEngine off


Теперь требуется, чтоб и при вызове несуществующего сабдомена (http://some.domain.ru/) происходил редирект на главную страницу.

Как это сделать корректно?

Спасибо!
Автор: stalker_2000
Дата сообщения: 07.04.2008 16:28
Приветствую! Подскажите плз - есть код:

Код:
DirectoryIndex index.php index.html
Options -Indexes

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{HTTP_HOST} ^domain.com.ua
RewriteRule (.*) http://www.domain.com.ua/$1 [R=301,L]

RewriteRule ^about\/(?:.*)$ index.php?menu=2
RewriteRule ^contacts\/(?:.*)$ index.php?menu=5

RewriteRule \.php - [F]
Автор: andead
Дата сообщения: 07.04.2008 17:44

Код: RewriteRule ^about\/(?:.*)$ index.php?menu=2 [L]
RewriteRule ^contacts\/(?:.*)$ index.php?menu=5 [L]
Автор: unique1988
Дата сообщения: 09.04.2008 23:27
Здраствуйте,у меня тут вопрос.
У меня имеется тест по определенной дисцип. ,когда тот кто отвечает на этот тест он записываеться в базу где пишеться его имя которое он ввел и пишется процентный коэффицент правильных вопросов. Я сделал страницу которая выводит из базы test с таблицы ye1 (сюда записываются данные о результате теста) Имя пользователя и его процент правильных ответов. Вот сам вопрос .. Можно ли сделать как нибудь,чтобы не проценты выводились ,а оценка.
Например от 1% до 30% - оценка 2, 31%-60% - 3, 61%-80% -4 и 81%-100% -5.
Не обязательно в этих пределах,но что то в этом роде ...
Автор: Cheery
Дата сообщения: 09.04.2008 23:30
unique1988

Цитата:
Здраствуйте,у меня тут вопрос.

У вас не тут вопрос, так как ваш вопрос не имеет никакого отношения к этой теме!

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

можно.. простейшая математика.
на вашем уровне можно даже просто через if ы сделать
Автор: unique1988
Дата сообщения: 09.04.2008 23:44

Цитата:
У вас не тут вопрос, так как ваш вопрос не имеет никакого отношения к этой теме!

Сори не углядел.

Цитата:

можно.. простейшая математика.
на вашем уровне можно даже просто через if ы сделать

Да я пробывал уже, но не получилось
Автор: Cheery
Дата сообщения: 10.04.2008 02:54
unique1988

Цитата:
Да я пробывал уже, но не получилось

и что же не получилось?
предположим, что в $p - процентное выражение для данного ответившего
if($p>=1&&$p<=30)
$grade=2;
else if ($p>=31&&$p<=60)
$grade=3;
else if ($p>=61&&$p<=80)
$grade=4;
else if ($p>=81&&$p<=100)
$grade=5;

что в этом сложного?
Автор: unique1988
Дата сообщения: 10.04.2008 09:07
Спс большое Cheery , все работает.
Автор: stalker_2000
Дата сообщения: 10.04.2008 10:09
andead

Цитата:
RewriteRule ^about\/(?:.*)$ index.php?menu=2 [L]
RewriteRule ^contacts\/(?:.*)$ index.php?menu=5 [L]

Не работает, всё равно доступ запрещён


Код: DirectoryIndex index.php index.html
Options -Indexes

RewriteEngine on
Options +FollowSymlinks
RewriteBase /

RewriteCond %{HTTP_HOST} ^domain.com.ua
RewriteRule (.*) http://www.domain.com.ua/$1 [R=301,L]

RewriteRule ^about\/(?:.*)$ index.php?menu=2 [L]
RewriteRule ^contacts\/(?:.*)$ index.php?menu=5 [L]

RewriteRule \.php - [F]
Автор: schalke
Дата сообщения: 12.04.2008 08:37
Такая задача:
есть сайт domen.ru
все страницы имеют вид domen.ru/index.php?id=номер_какой-то
требуется сделать чтобы они имели читаемый формат то есть
domain.ru/privet_vsem.html
Для этого как я понял нужно завести базу соответствия id и названия страницы(чтол то типа 1-privet_vsem.html 2-pro_pogodu.html и т.д.)
Непонятно какое правило сделать для mod_rewrite и структура скрипта обработчика
Автор: 6epcepk
Дата сообщения: 12.04.2008 08:42
Код для реврайта указан посто выше. В базе храним псевдо статический адрес публикации.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

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


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