Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   mod_rewrite etc. (http://forum.oszone.net/showthread.php?t=30905)

vadimiron 06-06-2004 14:41 211550

mod_rewrite etc.
 
Вот только недавно познакомился с этим замечательным модулем

Вот что я вынес из данного знакомства-с помощью mod_rewrite можно:
1) Самое распространённое использование-перезапись урлов, например есть урл index.php?forum=webmaster&topic=45
можно переписать в index.php/webmaster/45, что для некоторых поисковых машин намного более лучший вариант
2)запретить доступ к определённому файлу
RewriteRule ^file.ext$ - [F]
3)запретить доступ определённому браузеру, сборщику почты, доступ с определённого айпи или пришедшим с определённого сайта
RewriteCond %{HTTP_USER_AGENT} ^Browser_Name [OR]
RewriteCond % {REMOTE_HOST} ^www.badsite.com$ [OR]
RewriteCond % {REMOTE_ADDR} ^169.45.23.01$
RewriteRule ^.*$ - [F]

Это было самое распространённое применение данного модуля, но есть ещё много всяких интересных хитростей:
наприсер я недавно нашёл такое применение-при вызове страницы pic.html, нужно показывать картинку дня, поэтому можно переписать этот урл в pic-06-06.html c помощью серверных переменных TIME_MON и TIME_DAY
RewriteRule ^pic.html$ pic-%{TIME_MON}-%{TIME_DAY}.html

Или ещё кому нравится можно переписать файл index.php кому очень захочется :) в index.bmp

Если кто ещё знает интересные применения данного модуля, то постите тут

mar 07-06-2004 14:20 211551

русский первод доков
еще
и т.д. см. * на opennet
А *вот проблемы и достижения в форумах *(все по тому же сайту)

а если реально кто чего еще интересного делает, то я тоже с удовольствием послушаю :)


[s]Исправлено: mar, 0:11 9-06-2004[/s]

Prisoner 08-06-2004 01:30 211552

mar, к тебе тоже нижайшая просьба оформлять ссылки тегами форума. Пусть и не длинные ссылки, но смотрятся как-то... хм... не эстетично :). Не говорю уж о длинющих.

mar 09-06-2004 00:12 211553

Prisoner извинямс :user:

vadimiron 09-06-2004 02:38 211554

Prisoner-это по настоящему всё от лени можно же просто взять и скопировать из адресной строки браузра :) Но мы будем исправлятся:)

mar
У меня тут возникла такая проблема: надо переписывать адреса такого типа www.site.com/lalala в www.site.com/file.php?var=lalala - это без проблем получается, но у меня в этой же директории есть ещё папки, которые должны вызыватся как обычные папки и адрес на них не должен переписыватся
Я думал, так может пройти:
RewriteCond %{REQUEST_URI} !-d
но почему то не проходит :(
приходится каждую папку по отдельности перечислять:
RewriteCond %{REQUEST_URI} !papka_name

А если создам новою важную папку и забуду RewriteCond  дописать, то ничего хорошего из этого не выйдет, нужен какой то общий вариант, чтобы все папки отсекал

mar 09-06-2004 12:19 211555

vadimiron
не знаю, я ведь им не пользуюсь, хотя знаю, что есть очень большие любители :)
Мне не нравятся длинные ссылки в скриптах (и с ними не всегда можно защет POST cладить.) Но аналогично длинная система каталогов мне нравится, пожалуй, еще меньше :(
На сайты же ходят не только поисковики, но и люди :)

А что касается твоего вопроса - там, намколько мне помнится можно:
- поиграть regexp-ами
- подставить обрабатывающий скрипт (ну, он может, например, проверять реальное дерево каталогов и запрещать его переписывать)
Но это все общие соображения. Своего опыта работы с модулем  у меня нет.

vadimiron 17-08-2004 00:34 211556

Делать мне было нечего и решил я по данной теме маленькую статью накатать :)
Надеюсь кому нибудь поможет.
Ссылки на официальный мануал (перевод на русский):
Мануал
Ну сначало, проверьте, установлен ли этот модуль у вас. Внимание: это спец модуль к апачу, с другими серверами он *не работает.
Все команды данного модуля пишуться в файл .htaccess, причём если уже что то в данном файле стоит, то можно смело писать со следущей строки.
Команды модуля состоят из определённых директив, вот они :
RewriteEngine
RewriteBase
RewriteCond
RewriteLock
RewriteLog
RewriteLogLevel
RewriteMap
RewriteOptions
RewriteRule
Скажу честно, что не всеми директивами я пока владею, но всё основное сейчас опишу.
Начинается вся красота с включения модуля
Код:

RewriteEngine on
Эта первая строчка, которая должна присутствовать, чтобы модуль заработал, причём если далее следует много различных директив, достаточно поставить RewriteEngine off, чтобы деактивировать действие всех команд, не надо при этом комментировать все строчки.
Вторая обязательная строчка, без которой механизм преобразований работать не будет:
Код:

Options +FollowSymlinks
Если ваш системный администратор запрещает Вам использование «Options +FollowSymlinks», Вы не сможете ограничить использование mod_rewrite для отдельных каталогов, вместо этого изменения будут действовать на весь сервер.
Следущей обязательной командой нужно определить базовый URL (область) работы модуля, этим занимается директива RewriteBase:
Код:

RewriteBase /
"/" эквивалентно http://yoursite.com, но можно конечно и другой базовый URL указывать(например, когда URL'ы НЕ прямо соответствуют физическим путям, но об этом подробнее в официальном мануале)
Следущая интересная директива это RewriteLog, как ни сложно догадаться, она служит для определения файла ведения логов работы модуля. Пример из мануала:
Код:

RewriteLog "/usr/local/var/apache/logs/rewrite.log"
Раз уж говорим про ведение журнала, то ещё одна директива по этому поводу: RewriteLogLevel а, причём а равно от 0 до 9, где 0=журнализация не ведётся, 9=записываються почти все действия модуля.
Ну а теперь самое интересное: директива RewriteRule-она как раз занимается обработкой и перезаписью урлов (и не только этим).
На каждое правило пишется свой RewriteRule. Также очень важен порядок, надо следить, чтобы второй RewriteRule не испортил работу первого RewriteRule, то есть чтобы они не пересекались.
В общем виде выглядит это так:
Код:

RewriteRule шаблон действие
Шаблон-это "нормальный урл", который мы ищем для обработки. Шаблон основан на ПЕРЛ-совместимых регулярных выражениях. Действием же может быть "новый урл", то есть тот урл, который мы хотим получить в результате обработки, или какой нибудь флаг (будут ниже рассмотрены).
Также следует отметить, что в RewriteRule и RewriteCond(следует ниже) можно использовать переменные сервера (%{VARNAME}) (их полный список в официальном мануале).
Ну теперь перейдём к простому примеру:
Код:

RewriteRule ^file.ext$ - [F]
^ якорь начала строки
$ якорь конца строки
file.ext какой то любой файл
[F] флаг, обозначающий запрещение.
То есть вся строка обозначает, что при вызове данного файла будет выдана ошибка номер 403.
Следущий пример: перед нами стоит задача-вместо такого урла topic.cgi?forum=20&topic=1089, получать такой topic.cgi/20/1089
Код:

RewriteRule ^topic\.cgi/(\d{,2})/(\d{,5})$ topic.cgi?forum=$1&topic=$2
Сначало замечу: то, что в шаблоне пишеться в скобках, используется потом в качестве переменных в действии (в порядке возникновения скобок получаем $1, $2, $3 ....).
Теперь как действует предыдущий пример: есть например такой запрос topic.cgi/20/1089, данная строка сверяется с шаблоном и если строка совпадает с шаблоном, что и происходит в нашем случае, урл трансформируется в topic.cgi?forum=20&topic=1089 и далее идёт вызов именно этого урла.
20 в нашем случае = $1 ( то есть(\d{,2}) ), а 1089-$2 ( то есть(\d{,5}) ).
Ещё один пример: мы перенесли папку soccer из корня сайта в папку sport, и не хотим переписывать все ссылки (ну и ссылки в избранном юзеров мы не сможем поменять)
Код:

RewriteRule ^soccer/(.*)$ sport/soccer/$1
(.*) равно $1 и обозначает любые знаки в любом количестве, так как вряд ли вызывается просто папка, наверняка какой нибудь файл из даной папки со своими переменными и тд.

Следует отметить, что RewriteRule не так часто употребляется в одиночестве, чаще его действие ограничивается условием, когда может выполняться данный RewriteRule. Условие выполнено в виде отдельной директивы RewriteCond. Главное здесь, что условие должно быть прописано перед правилом. На одно правило может приходится несколько условий (все эти условия должны быть выполнеными, чтобы перейти к выполнению правила, но также условия можно связать словом "или"-для этого в конце каждого условия, кроме последнего, ставится флаг [OR]).
В общем виде условие выглядит так: RewriteCond СравниваемаяСтрока Условие
СравниваемаяСтрока в 99% выражается серверной переменной (но также может быть простым текстом с использованием например переменной($1, $2, $3...), созданной в правиле, к которому относится данное условие), условие же это шаблон, то есть регулярное выражение с некоторыми дополнениями. Данные дополнения выписываю просто из мануала:
'<Условие' (лексически меньше)
Условие считается простой строкой и *лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие.
'>Условие' (лексически больше)
Условие считается простой строкой и *лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие.
'=Условие' (лексически равно)
Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ в символ). Если Условие имеет вид "" (два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой.
'-d' (является ли каталогом)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом.
'-f' (является ли обычным файлом)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом.
'-s' (является ли обычным файлом с ненулевым размером)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля.
'-l' (является ли символической ссылкой)
СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой.
'-F' (проверка существования файла через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью *— это отрицательно сказывается на производительности сервера!
'-U' (проверка существования URL через подзапрос)
Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью *— это отрицательно сказывается на производительности сервера!

Пример
Код:

RewriteCond %{REMOTE_ADDR} ^212.37.64.23$
RewriteRule ^.*$ - [F]

Если REMOTE_ADDR равен 212.37.64.23, то ставим запрет на любой запрос, исходящий с данного айпи

Код:

RewriteCond %{REMOTE_HOST} ^www.somesite.com$
RewriteRule ^.*$ page.html

Всех, пришедших по ссылкам, расположенным на сайте www.somesite.com, перенаправляем на страницу page.html

Код:

RewriteCond %{REQUEST_URI} !uri1
RewriteCond %{REQUEST_URI} !uri2
RewriteCond %{REQUEST_URI} !uri1
RewriteRule ^([a-zA-Z0-9_-]{3,40})$ user.php?user=$1

Если ури не равен uri1, uri2 или uri3, то переписываем данный ури ([a-zA-Z0-9_-]{3,40}-это я так данный ури выразил) как user.php?user=$1 (вместо $1 можно было бы написать %{REQUEST_URI}, по сути получается то же самое)

Вроде, если в кратце рассказывать-это всё.
Ещё пару интересных примеров, которые я нашёл на различных сайтах:
Пример 1
Код:

Цель – показать посетителям «фото дня». Посетитель, кликнувший по ссылке http://yoursite.com/pic.html увидит лучшую
фотографию или картинку дня, и так каждый день. Мы будем работать с серверными переменными:
TIME_MON
TIME_DAY
Поместим в файл .htaccess одну единственную строку:
RewriteRule ^pic.html$ pic-%{TIME_MON}-%{TIME_DAY}.html
Запрашиваемый URL будет перезаписан, например:
pic-08-28.html
pic-08-29.html
pic-08-30.html
и так далее.
Теперь, все что вы должны сделать – это единожды загрузить файлы с соответсвующими именами и
забыть о ежедневном обновлении ссылки. Переменные времени также могут использоваться для другой периодичности.

Пример 2
Код:

Проблема отсутствующего завершающего слэша
Описание:
Каждый вебмастер может спеть песню о проблеме отсутствующих завершающих слэшей при использовании URL ссылающихся на каталоги.
Если они отсутствуют, сервер выдает ошибку, потому что если вы пишете /~quux/foo вместо /~quux/foo/ сервер ищет файл foo.
И поскольку этот файл является каталогом, происходит ошибка. В действительности, в большинстве случаев это исправляется само, однако,
в некоторых случаях, нужно самим эмулировать этот механизм.
Например, после того, как вы сделали массу сложных редиректов URL на CGI скрипты и т.д.

Решение:
Решение этой тонкой проблемы — это позволить серверу добавлять завершающий слэш автоматически.

Чтобы сделать это правильно, мы должны использовать внешний редирект, для того чтобы браузер правильно запрашивал картинки и пр.
В случае если бы мы *сделали только внутренний редирект, это бы работало только для самой страницы каталога (страницы по-умолчанию),
однако были бы проблемы при наличии любых картинок на этой странице с относительными URL,
 потому что браузер сделал бы запрос на вставку in-lined объекта. Например, запрос для image.gif на странице /~quux/foo/index.html
без внешнего редиректа выглядел бы как /~quux/image.gif!

Поэтому, для того чтобы сделать это трюк, мы пишем:

RewriteEngine *on
RewriteBase * */~quux/
RewriteRule * *^foo$ *foo/ *[R]

Сумашедший и ленивый может даже сделать следущее в *файле .htaccess находящемся в корне веб-пространства своего сайта.
Однако, следует отметить, что это создает некоторые накладные расходы.

RewriteEngine *on
RewriteBase * */~quux/
RewriteCond * *%{REQUEST_FILENAME} *-d
RewriteRule * *^(.+[^/])$ * * * * * $1/ *[R]

Пример 3
Код:

Поиск страниц больше чем в одном каталоге
Описание:
Иногда необходимо позволить веб-серверу искать страницы больше чем в одном каталоге. Здесь вам не помогут ни MultiViews ни *другие техники.

Решение:
Мы пишем явный набор правил который ищет файлы в каталогах.

RewriteEngine on

# * во-первых попытаемся найти это в указанном месте/...
# * ...и если нашли то заканчиваем поиск и сидим и радуемся:
RewriteCond * * * * /your/docroot/dir1/%{REQUEST_FILENAME} *-f
RewriteRule *^(.+) */your/docroot/dir1/$1 *[L]

# * во-вторых - попытаемся найти это в pub/...
# * ...и если нашли то заканчиваем поиск и сидим и радуемся:
RewriteCond * * * * /your/docroot/dir2/%{REQUEST_FILENAME} *-f
RewriteRule *^(.+) */your/docroot/dir2/$1 *[L]

# * иначе продолжаем для других директив Alias или ScriptAlias,
# * и т.д.
RewriteRule * ^(.+) *- *[PT]

Короче ещё много чего можно придумать :)

И наполедок ещё две директивы: RewriteMap и относящиеся к ней RewriteLock. Директива RewriteMap-ассоциативный массив преобразований, который может быть использован в правилах преобразований и использующий соответствующие функции для вставки/извлечения элементов, для поиска по ключу соответствующих значений. Источник этого поиска может иметь различный тип. Но я этим не умею пользоваться, подробности смотрим в мануале.

[s]Исправлено: Prisoner, 3:43 29-08-2004[/s]

mar 19-10-2004 23:27 211557

а мне тут приспичило закрывать доступ скрипткидесам (ну достали, прямо скажем)
вот вариант - когда закрывается доступ списку ip и машин:
Цитата:

Решение:
Для Apache версий >= 1.3b6:

RewriteEngine on
RewriteMap    hosts-deny  txt:/path/to/hosts.deny
RewriteCond  ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond  ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule  ^/.*  -  [F]

Для Apache версий <= 1.3b6:

RewriteEngine on
RewriteMap    hosts-deny  txt:/path/to/hosts.deny
RewriteRule  ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/
RewriteRule  !^NOT-FOUND/.* - [F]
RewriteRule  ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/
RewriteRule  !^NOT-FOUND/.* - [F]
RewriteRule  ^NOT-FOUND/(.*)$ /

##
##  hosts.deny
##
##  ВНИМАНИЕ! Это ассоциативный массив, а не список, даже если мы его относим к списку.
##            mod_rewrite берёт из него пары ключ/значение, поэтому, для каждой записи,
##            должно быть представлено по крайней мере фиктивное значение "-".
##

193.102.180.41 -
bsdti1.sdm.de  -
192.76.162.40  -
ну, а дальше пишем скрипт, который анализирует логи апача и всех эксперементаторов туда прописывает. По крону и без права замены штрафом ;)

Добавлено:

хм, печально, но факт - для броузеров вышеперечисленные мной запреты честно генерят отлупы, а вот от такой штуки не спасают:
telnet ххх.ххх.ххх.ххх 80
Trying ххх.ххх.ххх.ххх...
Connected to ххх.ххх.ххх.ххх.
Escape character is '^]'.
то есть пустили по http порту и ничем наш модуль не помог :(

CodeMaker 16-02-2005 08:40 298745

Вот блуждал по инертену и наткнулся вот на что, на сайте
http://www.apache.tut.ru/

кликая по ссылке в которой прописано http://far.h1.ru/serv/apache/#c2
попадаешь опять на этот адрес http://www.apache.tut.ru/ как это реализовано? По какой ссылке нажмешь в стусно строке остается все тожа и страницу грузится по другим ссылкам.


Вобмщем вопрос такой :))
как сделать чтобы в статусной сроке было прописано к примеру
http://www.apache.tut.ru/ но загружались страницы
http://far.h1.ru/serv/apache/#c2
http://far.h1.ru/serv/apache/#c3
http://far.h1.ru/serv/apache/#c3
в зависимости от того по какой из сылок перейти

Prisoner 17-02-2005 10:20 299151

Не совсем понятный вопрос, если честно. В описании имеет место быть банальный редирект. Поглядите окументацию и примеры приведенные выше. Это вам необходимо.

vadimiron 19-02-2005 16:35 299917

CodeMaker, Prisoner
Не, там просто фреймовая структура реализована
Материнский фрейм занимает всю страницу, но ничего не отображает, а весь контент находится в дочернем фрейме, который тоже занимает всю страницу, но ложиться сверху на материнский, то есть при нажатии на ссылки происходить загрузка в дочку, а по правилам браузера в адресной строки всегда стоит адрес матери, и так как в маму ничего не грузим, то и адрес не меняется

ABrun 16-07-2005 14:53 341455

Может кто знает... с помощью mod_rewrite надо очень решить такую задачку:

Есть сервер А на котором несуществующая ссылка типа http://serverA.com/top/

Нужно, чтобы открылся скрипт тор-листа, но на сервере B, где он и установлен. И при этом важно, чтобы URL в строке запроса оставался http://serverA.com/top/ даже если перехожу по относительным ссылкам этого скрипта.

То есть, если понятнее - надо показывать папку сайта В под своим доменом (сайт А). Типа это моя папка.... :)

vadimiron 16-07-2005 16:13 341467

Примерно так:
PHP код:

RewriteRule ^http://serverA.com/top/$ http://serverB.com/top/ 


Surround 25-07-2005 21:57 343519

:sorry:
извиняюсь, читал-читал, пытался, но так и не получилось, чтобы URL типа site.net/?action=view записывался как site.net/view или просто как site.net, чтобы все срезалось. Такое возможно?

ABrun 25-07-2005 22:11 343523

Наверно так должно получится-

RewriteRule ^\?action\=view(.*) http://www.site.net$1

Но я не уверен, уже были похожие проблемки -
?action=view содержит символы - ?=, советуют их экранировать \ попробуй,
может получится.

посмотри еще есть две классные статьи с примерами -
http://www.egoroff.spb.ru/

Surround 21-08-2005 02:02 349570

Вообще задача такая: чтобы запрос вида test.php?d=.. был виден в строке браузера как просто test.php или еще что-нить левое. чтобы скрыть передаваемые перменные. такое возможно?

Prisoner 22-08-2005 14:58 349820

Можно скрыть в других данных: test/fh483jfg89e83mjr9j4. Тут мусор слева и справа можно генерить случайным образом, но определенной длины, т.о. найти необходимое не составит труда - в примере некий параметр пусть будет равен 89. Иначе, имхо, только с финтами ушами более финтового порядка: кукисы, POST запросы, фреймы.

benya 13-09-2005 11:12 355125

Кстати, почему данный модуль не работает на Win32?

Prisoner 13-09-2005 15:13 355173

Отчего же... проверьте все еще раз, все корректно работает, впервые слышу о таком.

benya 13-09-2005 20:42 355242

Гм.... что нужно сделать что бы заработал модуль? По сути расскоментировать две строки в конфигурационном файле апача. Я все сделал - не работает.

Prisoner 14-09-2005 11:29 355400

угу, а еще сконфигурировать правила и опции в .htaccess, что в корне сайта будет.
К примеру
Код:

RewriteEngine on
RewriteRule ^news[\/]{0,1}$                                                  /index.php?page=news&nid=0
RewriteRule ^news/([0-9]+)[\/]{0,1}$                                        /index.php?page=news&nid=$1
RewriteRule ^news/archive[\/]{0,1}$                                          /index.php?page=news/archive&nid=0
RewriteRule ^news/archive/([0-9]+)[\/]{0,1}$                                /index.php?page=news/archive&nid=$1
RewriteRule ^mail[\/]{0,1}$                                                  /index.php?page=mail&cid=0&oid=0&did=0
RewriteRule ^mail/([0-9]*)[\/]{0,1}$                                        /index.php?page=mail&cid=$1&oid=0&did=0
RewriteRule ^mail/([0-9]*)/([0-9]*)[\/]{0,1}$                                /index.php?page=mail&cid=$1&oid=$2&did=0
RewriteRule ^mail/([0-9]*)/([0-9]*)/([0-9]*)[\/]{0,1}$                      /index.php?page=mail&cid=$1&oid=$2&did=$3
RewriteRule ^([a-zA-Z0-9_\/\$]*)[\/]{0,1}$                                  /index.php?page=$1&%{QUERY_STRING}


benya 14-09-2005 14:12 355434

Да все я это сконфигурировал и htaccess правильный. На удаленном хостинге работает. А на моем win32 домашнем - Нет. Апач 1.3.23. Ошибка 404 нет такой страницы ;(

E-mail 29-09-2005 23:06 360173

benya можно попробовать писать полные пути а не относительные

benya 29-09-2005 23:08 360175

Нет я уже разобрался. htacess то по умолчанию выключен. Вот и вся проблема. Работает.

Tatan1 10-02-2006 14:00 405189

Подскажите как сделать чтобы вот так было: есть файлы в корне сайта типа about.php, contact.php, index.php и т.п. и их можно было-бы вызывать например вот так: http://www.site.com/about или например, http://www.site.com/index.php?about.
Если можно, приведите пожалуйста полный листинг того, что надо добавить в .htaccess. Заранее благодарен.

Prisoner 10-02-2006 18:19 405257

Код:

RewriteEngine on
RewriteRule ^about[\/]{0,1}$                                                  /index.php?about

Как вариант. Второй вид вызова (через index.php) не будет обработан условиями мода и потому тоже сработает на показ странички about.

Tatan1 10-02-2006 21:50 405304

Prisoner
Не получается, ошибка 403.

Vadikan 01-03-2006 06:56 412217

Какая интересная тема! Я ее обязательно прочитаю целиком, если вы скажете можно ли сделать следующую вещь. Есть поддомен unattended.oszone.net (некоторые о нем даже знают ;-), но все материалы уже давно переехали и главная страница находится тут http://oszone.net/display.php?id=2747

Когда осуществлялся переезд я где-то вычитал про htaccess (o котором вообще понятия не имел) и сделал
Код:

RedirectMatch seeother ^/(.+)$ http://oszone.net/display.php?id=2747
чтобы все запросы на страницы поддомена перебрасывались на новую главную страницу. Это все работает, и при запросе unattended.oszone.net все попадают куда надо. А можно ли сделать так, чтоб в адресной строке после этого отображалось не
Код:

http://oszone.net/display.php?id=2747
а
Код:

http://unattended.oszone.net
Спасибо за внимание!

Prisoner 01-03-2006 16:20 412441

Это внешний редирект используется. Можно попробовать (для относительных ссылок на unattended.oszone.net) применить правило для внутреннего редиректа чего бы то ни было на oszone.net. Тогда часть .htaccess ответственная за это дело примет вид:
RewriteEngine on
RewriteCond %{SERVER_NAME} ^unattended.oszone.net$
RewriteRule ^(.+)[\/]{0,1}$ http://oszone.net/$1?%{QUERY_STRING}

Пример бы имел практический смысл, если бы не делал тоже самое, что выше - не менял адрес в адресной строке. Но, насколько я понял без внешнего редиректа (когда сервер в силу каких-то причин отправляет броузеру заголовочную информацию о смене адреса) с домена на домен не обойтись. Прошу коллег поправить меня, если я ввожу в заблуждение уважаемого модератора.

Vadikan 02-03-2006 05:11 412675

Prisoner
Спасибо за ответ. Возможно, я не совсем подробно об'яснил, а еще не исключено, что я выбрал совсем не ту тему для вопроса. Попробую пояснить в меру моих весьма скромных знаний в данной области. Когда поддомен был создан, я получил данные для соединения по FTP: IP, username/pass. После установки соединения я попадал в каталог с
cgi-bin\
html\
logs\
В html все мои файлы и лежали. Туда же в итоге я кинул свой htaccess. Мне никто толком даже об'яснить не мог как нормально редирект сделать :) Так что я нарыл что-то в гугле...

Теперь все, что я хочу сделать - это отображать другой адрес в адресной строке. Т.е. не адрес страницы, отдаваемой движком сервера, а поддоменное имя. Возможно ли такое вообще? Может надо действовать иными методами и mod_rewrite тут вообще не причем?

vadimiron 02-03-2006 10:30 412763

Vadikan
А доступ к конфигу Apache есть?? Тогда можно сделать виртуальный хост

Vadikan 02-03-2006 21:18 413052

vadimiron
Есть. А что надо сделать конкретно?

Sham 30-04-2006 02:09 432846

Vadikan
Код:

RewriteEngine on
RewriteRule ^/(.+)$ http://oszone.net/display.php?id=2747 [P]

Флаг P делает подзапрос (скрытый для клиента) с помощью модуля mod_proxy. Если этого модуля нет, то не судьба...

Vadikan 30-04-2006 08:43 432860

Sham
Значит можно все-таки? :) Но я не вижу где указан домен, который должен отображаться: http://unattended.oszone.net/
Цитата:

mod_proxy. Если этого модуля нет, то не судьба...
Раз это модуль, то наверное его можно установить или подключить? Можно подробнее, я в этом не разбираюсь.

Sham 30-04-2006 11:29 432896

Vadikan
У тебя ж .htaccess в поддомене unattended? Значит на любой URL (на этот поддомен) в соотв. с регуляркой будет подзапрос на реальный сайт (второй URL), и первый URL в строке браузера останется (подзапрос то скрытый, браузер ни о чем не догадывается :)).

здесь также уточнил на случай ссылки вида unattended.oszone.net/display.php?* (флаг L чтобы правило не циклило):
Код:

RewriteEngine on
#RewriteCond %{THE_REQUEST} display\.php
#RewriteRule ^(.+)$ http://oszone.net$1 [L,P]
RewriteRule .* http://oszone.net/display.php?id=2747 [L,P]

Без практической проверки тут не обойтись, т.к. mod_rewrite штука хитрая, и порой непредсказуемая, может зациклить :)

Насчет mod_proxy. Надо посмотреть в phpinfo() в loaded modules. Если нету там, то открой httpd.conf и раскоменть строку LoadModule proxy_module modules/mod_proxy.so (убери #).

Vadikan 01-05-2006 21:29 433249

Sham
Спасибо за развернутый ответ. Надо поэкспериментировать. Пока что после переезда на новый сервер перестало работать то, что было раньше
Код:

RedirectMatch seeother ^/(.+)$ http://oszone.net/display.php?id=2747
:) Я даже толком не знаю что там происходит...

Цитата:

здесь также уточнил на случай ссылки вида unattended.oszone.net/display.php?* (флаг L чтобы правило не циклило):
Вообще-то, таких ссылок нет. Возможно где-то сохранились в сети ссылки на старые страницы типа unattended.oszone.net/dir/page.html Такие надо бы все равно редиректить на главную страницу.

Sham 03-05-2006 02:33 433649

Vadikan
А поясни, пожалуйста, зачем у тебя в строке seeother? Вообще, маркеры (^$) не нужны там. И скобки тоже (подстановку то не делаем). Как говорится, будь проще...
Код:

RedirectMatch .* http://oszone.net/display.php?id=2747

#Или то же самое с пом. mod_rewrite:

RewriteEngine on
RewriteRule .* http://oszone.net/display.php?id=2747 [L,R]

Цитата:

Вообще-то, таких ссылок нет. Возможно где-то сохранились в сети ссылки на старые страницы типа unattended.oszone.net/dir/page.html Такие надо бы все равно редиректить на главную страницу.
а, ну тогда только оставим 1 и 4 строку в коде (в моем предыдущем посте).

Vadikan 03-05-2006 02:59 433651

Sham
Цитата:

А поясни, пожалуйста, зачем у тебя в строке seeother?
Вот, второй абзац :idontnow:

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

Siava one 23-07-2006 02:27 463963

Привет всем :)
А как можно сделать с помощью rewrite_mod, чтобы вместо "битых" картинок в форуме отображалась какая-нибудь одна и та же.
Например кто-нибудь с помощью тега [img] выложил картинку, а через некоторое время картинки не стало физически.. чтобы не было пустого прямоугольника.

Vlad Drakula 23-07-2006 10:15 463990

Siava one
нужно настраивать скорее всего не rewrite_mod а то что отсылается в случае если файл не найден.

Sham 23-07-2006 19:06 464083

Siava one
попробуй это
Код:

RewriteCond %{THE_REQUEST} .+\.(jpg|gif|png|jpeg|bmp|tiff)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .+ picture.jpg [L]

подправь там где надо, или если синтаксис не тот (что то не помню, слеш нужен в последней строке али нет :)). Но моя идея вроде толковая (не проверял)...

Siava one 23-07-2006 22:17 464131

Sham
Спасибо, вот только не работает этот вариант :(
Я его и видоизменял по-всякому, ничего не выходит.

vadimiron 23-07-2006 23:50 464156

Siava one
А на чём написан сайт?? Если не просто ХТМЛ, а например, ПХП, то лучше такое на уровне скрипта делать

Siava one 24-07-2006 00:27 464172

vadimiron
На PHP, но я надеялся, что с mod_rewrite можно сделать универсальное решение.

vadimiron 24-07-2006 02:00 464187

Siava one
А почему вы демаете, что с mod_rewrite - универсальное решение??
А если другой вебсервак?? Или отключён mod_rewrite модуль??

Sham 24-07-2006 02:20 464192

Siava one
Я надеюсь, ты не думаешь, что с mod_rewrite можно управлять другим сервером :) ? В таких случаях я, например, внутри цикла формирования таблицы шерстил весь текст регуляркой на наличие тега(ов) IMG и src, вытаскивал URL(ы), а потом if (fopen(URL...))... ну и т.д. Но это сильно замедляет процесс...

Вообще то надо бы поточнее инфу, где твоя картинка лежит, где картинки юзеров. В начале еще ставить надо RewriteEngine On (забыл)... Конкретику давай, будет тебе код конкретный :kruto: :)

Siava one 24-07-2006 03:30 464196

vadimiron
Хм.. Интересный вопрос =)

Sham
Ладно, вот конкретика :)
Имеется скрипт, с помощью которого народ загружает картинки, а потом выставляет их в форуме/дневниках. Вот адрес одной из таких картинок (5кб). А Вот адрес одной из тем форума, куда может быть вставлена картинка.
А далее, картинку удалили, в теме осталась дырка. Как этого избежать, автоматически залатав дырку какой-нибудь специальной картинкой через rewrite_mod? :)
Вроде изложил :D

Sham 24-07-2006 20:47 464446

Siava one
Код:

RewriteEngine On
RewriteCond %{THE_REQUEST} .+\.(jpg|gif|png|jpeg|bmp|tiff)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ picture.jpg [L]

этот код суй в .htaccess (в формате UNIX сохрани само собой) и ентот .htaccess клади в каталог с картинками (если не один, то во все. Можно общий сделать, но я иерархию каталогов у тебя не знаю). Файл picture.jpg должен там (где .htaccess) быть по-любому, а то зациклит :). Пробуй короче... Если зациклит, будем решать...

vadimiron 24-07-2006 21:38 464469

Siava one
Правда, зачем так мучиться?? Функция file_exists() и все дела

Siava one 24-07-2006 21:57 464476

Sham
Ваш код работает! Спасибо! :)

vadimiron
А как через file_exists() проверять в уже написанных постах? Лишняя нагрузка по-моему.

vadimiron 25-07-2006 00:15 464515

Цитата:

А как через file_exists() проверять в уже написанных постах? Лишняя нагрузка по-моему.
Ну так код, котрый выводит сообщение, всего один

Хотя с mod_rewrite тоже интересное решение, главное чтобы работало

Sham 25-07-2006 03:17 464528

Siava one
Цитата:

Ваш код работает! Спасибо!
Это не может не радовать :)

E-mail 30-07-2006 08:47 466264

у меня затык)

надо сделать:

редирект для тех кто приходит с

http://site.ru/k9/send.php?value=5&page=1-9

на

http://site.ru/k3/send.php?value=97&page=1-9

т.е. чтобы все page со значением (может быть любое через дефис или нижнее подчеркивание) работали как параметры метода get на урле куда они редиректятся (там скрипт)

все ссылки устроены так что те что были раньше по k9 должны ссылаться на k3 (директорию k9 удалили, создали директорию k3, и все соджержимое перенесли туда)

value - это переменная содержащая значение id страницы в базе, после переноса индексы поменялись, но четкие соответствия новых и старых значений - есть

значение page никак не должно менятся после редиректа, но она может быть любыми цыфрами через дефис (пользователь может захотеть посмотреть выборочно страницы скрипт их принемает как параметр get)


----
что делать?:)

Sham 31-07-2006 02:07 466540

E-mail
Код:

RewriteEngine On
RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)
RewriteRule ^k9/send\.php$ k3/send.php?value=97&page=%1

А value юзера должен быть равен только 5? Если да, то я понял прально. А если value юзера вообще не нужно проверять, то удали "value\=5\&" где условие (во второй строке). Клади .htaccess туда, где каталог k3 (но не в него!), т.е. в корень сайта, насколько я понял. Если уже есть какие-то правила там, то первая строка не нужна ессно... В общем не проверял, но работать должно. :)

E-mail 31-07-2006 04:07 466547

Цитата:

А value юзера должен быть равен только 5?
при вызове value=5 скрипт должен получать value=97
там их много, например при вызове
value=7 скрипт должен получать именно value=109
и при вызове именно value=50 скрипт должен получать именно value=2
и т.д.

Sham спасибо тебе большое!
завтра(сегодня уже) утром попробую:)

Sham 31-07-2006 19:43 466824

E-mail
Если так (ты бы сразу весь расклад дал), то этот вариант будет лучше. Special for you. :)
Код:

## этот код до черты в .htaccess и кладем в корень (перед k3)
RewriteEngine On
## подмена каталога k9 на k3
RewriteRule ^k9(.*)$ k3$1 [L]
-------------------------------------------------------------------------
## а этот .htaccess с кодом ниже кладем в каталог k3
RewriteEngine On
## проверка строки GET на нужное value
## следующие 2 строки повтори для каждого значения value
RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)
## тут переменные местами поменял, как страховка от зацикливания :)
RewriteRule ^send\.php$ send.php?page=%1&value=97 [L]


E-mail 02-08-2006 01:18 467248

Sham спасибо! и спасибо не за скрипт более, а более за
Цитата:

Special for
me,
это самое приятное и дорогое что можно редко встретить в мире

П.С.
хороших людей больше, они просто встречаеются реже

Vlad Drakula 02-08-2006 20:58 467604

301 («Moved Permanently»)

как прописать это в настройках площадки...
я немного поменял структуру сайта и хочу чтобы со старых страниц шел автоматический редирект на новые.

как это следать?

Vlad Drakula 02-08-2006 21:50 467611

в итоге решение взято здесь:
http://www.webconfs.com/how-to-redirect-a-webpage.php

но пришлось слегка модифицировать, вот что получилось:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^zimbabve/(.*)$ http://www.geo-world.ru/africa/zimbabve/$1 [R=301]

и да простить меня хостер за .htaccess размером в 93kb

E-mail 04-08-2006 11:20 468190

Vlad Drakula можно еще так:

RewriteRule ^(zimbabve|qw|ee|rrr|ttt)/(.*)$ http://www.geo-world.ru/$2/$1 [R=301]

если правильно понял тебя про
Цитата:

и да простить меня хостер за .htaccess размером в 93kb

Vlad Drakula 04-08-2006 13:01 468248

E-mail
ага... тогда один регексп будет в несколько десятков килобайт...

Sham 04-08-2006 22:05 468425

Vlad Drakula
Цитата:

немного поменял структуру сайта и хочу чтобы со старых страниц шел автоматический редирект
Хост чтоль поменял? Какие хоть измены то? А то поговорил сам с собой - и доволен... мне может тоже интересно... да и другим понятнее будет :)
Цитата:

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

Vlad Drakula 04-08-2006 22:16 468427

Sham
Цитата:

главно, чтоб юзер простил...
для них и и сделано... у них просто происходит переадресация и все... они этого и не замечают...

Цитата:

Хост чтоль поменял? Какие хоть измены то? А то поговорил сам с собой - и доволен... мне может тоже интересно... да и другим понятнее будет
в се очень просто было 190 категорий я их раскидал по 6 разделам... вот и все линки поменялись... все это было сделано чтобы старые линки работали...

Sham 05-08-2006 05:56 468483

Vlad Drakula
Цитата:

они этого и не замечают
как же... у тебя же внешний редирект, тоже самое, что header("location:...."), слепой не заметит...
Цитата:

в се очень просто было 190 категорий я их раскидал по 6 разделам
дааа, объяснил... ты лучше объясни, для чего внешний редирект делаешь, ежели хост не менял? Давай колись :)

Vlad Drakula 05-08-2006 09:43 468497

Sham
иначе перекидывалось на другой домен... у охной площадки два домена...

E-mail 16-08-2006 02:41 472689

Sham вообще то опять не так объяснил((

директорию k9 удалили, создали директорию k3,
но еще были директории k10 и k11 и теперь все это находится только в k3

загвоздка в том, что некоторые value у k10 такие же как и у k11 и k9 (

т.е. если раньеш была ссылка:

http://site.ru/k9/send.php?value=5&page=1-9

она должна стать:

http://site.ru/k3/send.php?value=97&page=1-9

а если ссылка:

http://site.ru/k10/send.php?value=5&page=1-9

она должна стать:

http://site.ru/k3/send.php?value=76&page=1-9

вот так вот(
и что тут можно сделать?..

Sham 16-08-2006 05:11 472702

E-mail
Код:

## этот код до черты в .htaccess и кладем в корень (перед k3)
RewriteEngine On
## подмена каталога k9, k10, k11 на k3
RewriteRule ^(k9|k10|k11)(.*)$ k3$2 [L]
-------------------------------------------------------------------------
## а этот .htaccess с кодом ниже кладем в каталог k3
RewriteEngine On
## если value по-разному меняется для k9, k10, k11, сверяем по каждому...
## ----------НАЧАЛО value=5-----------
## если value=5 и каталог k9
RewriteCond %{THE_REQUEST} \/k9\/
RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)((\&.+)*)$
RewriteRule ^send\.php$ send.php?page=%1&value=97%2 [L]
## если value=5 и каталог k10
RewriteCond %{THE_REQUEST} \/k10\/
RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)((\&.+)*)$
RewriteRule ^send\.php$ send.php?page=%1&value=76%2 [L]
## если value=5 и каталог k11 (к примеру)
RewriteCond %{THE_REQUEST} \/k11\/
RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)((\&.+)*)$
RewriteRule ^send\.php$ send.php?page=%1&value=ТВОЕ_ЧИСЛО%2 [L]
## -----------КОНЕЦ value=5-----------
##
## Если value одинаково меняется для всех мертвых каталогов...
## например value=6...
## -----------НАЧАЛО value=6------------
RewriteCond %{QUERY_STRING} value\=6\&page\=([0-9\-\_]*)((\&.+)*)$
RewriteRule ^send\.php$ send.php?page=%1&value=ТВОЕ_ЧИСЛО%2 [L]
## -----------КОНЕЦ value=6--------------
## и все в таком же духе...

Есть еще вариант с переменными окружения вместо THE_REQUEST, но так проще и надежнее IMHO...

E-mail 16-08-2006 20:38 473153

Цитата:

если value одинаков для k9, k10, k11, шерстим по каждой папке
эм, папок k9, k10, k11 уже нету и надеюсь больше не понадобится создавать эту кучу молу?((((((

а если я вдруг не помню какие именно цифры у папок совпадают, я конечно могу посмотреть, но тогда придется сравнить кучу файлов старых урлов, и скорее всего я так и поступлю(( , но можно както это автоматизировать?.... я например ума не приложу как..

кстати говоря, там помимом page и value есть еще параметр &lang=en или вообще lang может отсутствовать.....

Sham 17-08-2006 01:07 473229

E-mail
Цитата:

эм, папок k9, k10, k11 уже нету
а если чуточку внимательнее быть? Мы проверяем исходный URL регуляркой на наличие мертвых каталогов (к9-11), чтобы нужное правило сработало. А если от них ничего не зависит, чего тогда голову морочим?
Цитата:

а если я вдруг не помню какие именно цифры у папок совпадают
а вот давай ты мне свои мозги на мыло скинь и я ими подумаю, потом обратно тебе пришлю... :drug:

Ты видимо приколоться надо мной решил... :haha: каждый раз что-то новое мне сообщаешь... а если я тебе решение предложу, где гарантия, что ты еще что-нить не забыл?

С какой стороны (в каком месте) QUERY_STRING может быть &lang=en? Есть ли какая-нить логика в цифрах, которые у тебя меняются (может формула какая)? Что ты именно хочешь автоматизировать? Если логики нет, то без кучи-малы никак не обойтись...

Ты сначала посчитай, сколько всего значений value у тебя меняется, столько и будет наборов правил, и с каждым значением тебе придется работать отдельно (где каталоги разные, или еще че-нить). И что, в каждой папке send.php был? Извини, моя фамилия не Холмс...

E-mail 17-08-2006 08:22 473277

Sham нет я не прикалываюсь, просто обнаружилось еще несколько папок)..

Цитата:

С какой стороны (в каком месте) QUERY_STRING может быть &lang=en?
по идее в самом конце, после page, либо вообще не быть

Sham 18-08-2006 00:17 473792

E-mail, ну я обновил свой пост с кодом... там подстановка %2 содержит все, что справа строки GET... да и с комментами я че-то начудил... :fool:, в общем разберешься... если чего не так, скажи...

E-mail 18-08-2006 03:36 473832

Цитата:

если чего не так, скажи...
Sham спасибо Вам большое дорогой Шам! Вы лутший, смотрите, всего несколько мелочей:

- две решотки в одной строчки для парсера конфига опасно серверу)
- зачем разбивать на два файла - для корня и рабочей директории?
- вот этот код вообще мне кажется излишен:
Код:

RewriteEngine On
RewriteRule ^(k9|k10|k11)(.*)$ k3$2 [L]

- а вот тут к сожелению то, что справо от урла не будет работать как переменная со значением:
Код:

RewriteCond %{QUERY_STRING} value\=5\&page\=([0-9\-\_]*)((\&.+)*)$
RewriteRule ^send\.php$ send.php?page=%1&value=97%2 [L]

кроме того, дефис в переменной page после обработки модулем может пропасть вместе с последующей цифрой и доллар не будет учитываться (лишние 2 байта)
- и еще, лишняя проверка на директорию:
Код:

RewriteCond %{THE_REQUEST} \/k9\/
- если одна из переменных не передается и вовсе редирект также не будет реализован



Я реализовал это вот в таком виде:
Код:

RewriteEngine On
#
#-------
#--- k9
#-------
RewriteCond %{QUERY_STRING} value\=1
RewriteCond %{QUERY_STRING} lang\=ru
RewriteCond %{QUERY_STRING} page\=([0-9]*)(\-|\_)([0-9]*)
RewriteRule ^k9/send.php$ k3/send.php\?value\=101\&page\=%1%2%3\&lang\=ru [L]
#
RewriteCond %{QUERY_STRING} value\=1
RewriteCond %{QUERY_STRING} page\=([0-9]*)(\-|\_)([0-9]*)
RewriteRule ^k9/send.php$ k3/send.php\?value\=101\&page\=%1%2%3 [L]
#
RewriteCond %{QUERY_STRING} value\=1
RewriteRule ^k9/send.php$ k3/send.php\?value\=101 [L]
#-------
#--- k10
#-------
RewriteCond %{QUERY_STRING} value\=1
RewriteCond %{QUERY_STRING} lang\=ru
RewriteCond %{QUERY_STRING} page\=([0-9]*)(\-|\_)([0-9]*)
RewriteRule ^k10/send.php$ k3/send.php\?value\=111\&page\=%1%2%3\&lang\=ru [L]
#
RewriteCond %{QUERY_STRING} value\=1
RewriteCond %{QUERY_STRING} page\=([0-9]*)(\-|\_)([0-9]*)
RewriteRule ^k10/send.php$ k3/send.php\?value\=111\&page\=%1%2%3 [L]
#
RewriteCond %{QUERY_STRING} value\=1
RewriteRule ^k10/send.php$ k3/send.php\?value\=111 [L]

считайте это проверкой и считайте, что Вы ее прошли:)

с огромным уважением!

Sham 18-08-2006 05:35 473841

E-mail
Цитата:

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

зачем разбивать на два файла
так рациональнее, обычно в корне уже имеется htaccess, и заполнен под завязку. Поэтому ограничился только подменой мертвых каталогов на реальный. Еще заметь разницу в количестве кода :)
Цитата:

дефис в переменной page после обработки модулем может пропасть вместе с последующей цифрой и доллар не будет учитываться (лишние 2 байта)
а вот здесь подробнее, если можно :) куда пропадет дефиз? Какой доллар? Какие 2 байта? У меня там железно все... я пока не проверял, но обязательно это сделаю... Допускаю, что где-то доработать надо, но я на 99.9% уверен в своем коде.
Цитата:

лишняя проверка на директорию
Не разобрался! У меня лишнего ничего не бывает :)
Цитата:

если одна из переменных не передается и вовсе редирект также не будет реализован
какая переменная? какой редирект? Мы там редирект не делаем, а URL переписываем, это разные вещи. Про переменную подробнее пожалста... :)
Цитата:

считайте это проверкой и считайте, что Вы ее прошли
а это к чему? Прикол что-ли такой? :biggrin:

Все-таки думаю, ты не до конца разобрался в моем коде... у меня гораздо компактнее и рациональнее. Но как говорится - хозяин-барин...

benya 15-09-2006 11:37 485193

Господа а Apache 1.3.7 не поддерживает комбинаций типа \w{2}? В смысле нормальных регулярных выражений?

Sham 16-09-2006 03:54 485506

benya, Только POSIX-регулярки...

E-mail 30-10-2006 20:45 504604

а как сделать редирект

с site.ru/index.html на site.ru

с site.ru/index.htmlfmfmfkrk на site.ru

и с site.ru/все_что_угодно.htmldfklj на site.ru/все_что_угодно.html

и с site.ru/все_что_угодно.htmdfklj на site.ru/все_что_угодно.htm

и желательно по компактней?:)

поможите..

Sham 30-10-2006 22:37 504660

E-mail
Код:

RewriteEngine On
RewriteRule ^(.*)index\.html?(fmfmfkrk)?$ http://site.ru/$1
RewriteRule ^(.+)\.(html?)dfklj$ $1.$2


E-mail 31-10-2006 00:54 504707

Sham что прости заменить?:)

эм, а с директориями третьего и т.д. уровня такжеработает?

site.ru/ttt/index.html на site.ru/ttt/ ?:)

и еще как быть с htm и как учесть чтобы запросы ? и # не терялись?:)...


Sham 31-10-2006 03:49 504724

E-mail обновил, должно работать.
Цитата:

запросы ? и # не терялись
не теряются никуда :)
Цитата:

что прости заменить?
в первом правиле http://site.ru/$1 на $1index.php т.е. index.php это индексный файл в твоих директориях (или как у тебя там, не знаю). Это чтобы внешний редирект не делать, т.е. через header... (через юзера). А если так оставить, то если сработает первое правило, на браузер будет header посылаться (типа сайт переехал). Популярно объяснил? :) теперь проверяй.


E-mail 01-11-2006 23:09 505579

Sham запрос редиректил на документ рут)

другой вопрос как сделать редирект чтобы с запросов вида:

site.ru/go/home редиректило на site.ru/go/hotmepage.html

и с

site.ru/go/home/ редиректило на site.ru/go/hotmepage.html

?:)

при этом индекс по умолчанию index.php

Sham 02-11-2006 03:57 505613

E-mail где ты их берешь то? :)
Код:

## .htaccess в каталоге /go
RewriteEngine On
RewriteOptions inherit
RewriteRule ^home\/?$ hotmepage.html

p.s. не понял, индекс при чем?

E-mail 03-11-2006 00:47 506102

Sham RewriteRule ^(.*)index\.html?(fmfmfkrk)?$ http://site.ru/$1

а как понимать конструкцию: ?()?

RewriteOptions inherit это я так понимаю заставляет обрабатываться первым файл htaccess тот что в корне, а затем тот что в папке go? или я чтото не понимаю в этом мире?:) а зачем он нам? о_О

Цитата:

-mail где ты их берешь то?
да взять то не проблема:) много чего надо, тренируюсь, и смотрю кто как решает еще тоже самое:)


Sham 03-11-2006 20:51 506587

E-mail RTFM

E-mail 05-11-2006 02:45 507103

Sham не серьездный ответ для серьездного форума:)

Siava one 02-02-2007 12:01 544782

Снова привет :) и снова вопросы, на этот раз их 2.
1. Как сделать чтобы при любых запросах типа www.сайт.ru, www.bla-bla-bla.сайт.ru, bla-bla-bla.сайт.ru, 123.qwerty.сайт.ru перенаправляло на http://сайт.ru?
Так будет корректно?
Код:

RewriteCond %{HTTP_HOST}  ^(.*).сайт.ru$ [NC]
RewriteRule (.*) http://сайт.ru/$1 [R=permanent,L]

2. В .htaccess есть примерно такая блокировка от ссылок вида http://сайт.ru/any_page.php?url=http://сайт2.ru/...
Код:

RewriteCond %{QUERY_STRING} ^(.*)=http://(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)=http\%3A\%2F\%2F(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)=ftp://(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)=ftp\%3A\%2F\%2F(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)=https://(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)=https\%3A\%2F\%2F(.*) [NC]
RewriteRule ^.* - [F,L]

А как разрешить такие ссылки для одного файла, например для http://сайт.ru/go.php?url=http://сайт2.ru/...

Спасибо :)

Sham 02-02-2007 13:43 544835

Siava one
1. а энти папки то есть или их нет, а ежели есть, то где? Никто же не знает (я в т.ч.), как у тебя субдомены прописаны... если нет, то редирект в конф. файле надо прописать..., а есть - в кажную папку - htaccess. Огласите весь спск пжалста :)
2. сверху свое правило пропиши (они сверху вниз выполняются)...

Siava one 02-02-2007 15:25 544877

Sham
1. Субдоменов нет, но наверно апач у меня сконфигурирован так, что с любым субдоменом заходит на один и тот же сайт.
2. Так какое своё правило? У меня его нет, вот и спрашиваю как оно должно выглядеть? :)


P.S.
С п.1 разобрался :)
Код:

RewriteCond %{HTTP_HOST}  ^(.*).siava.ru$ [NC]
RewriteRule (.*) http://siava.ru/$1 [R=permanent,L]

п.2 пока под вопросом.

Sham 02-02-2007 20:56 544964

Siava one

1. дело хозяйское... но доп. инфа бы не помешала...
Код:

RewriteCond %{THE_REQUEST} ^.+\.сайт\.ru.*$ [NC]
RewriteRule ^(.*)$ http://сайт.ru/$1 [R,L]

2. Пробуй этот вариантик (с учетом того, что у тебя было - лишнего много imho)
Код:

RewriteCond %{QUERY_STRING} ^[^\=]+\=(https?|ftp).* [NC]
RewriteCond %{REQUEST_FILENAME} !^go\.php [NC]
RewriteRule .* - [F]


Siava one 02-02-2007 23:54 545012

Sham
Спасибо :) разобрался кажется, сначала не заработало, а потом нашёл ошибку свою :)

P.S.
Хотя.. при использовании остальных строчек это условие перестаёт работать. То есть допускает использование ?url=... с любыми другими файлами.
Вот мои извращения:

Код:

RewriteCond %{QUERY_STRING} ^[^\=]+\=(https?|ftp).* [NC]
RewriteCond %{REQUEST_FILENAME} !^forum\/go\/url\.php [NC]

# security settings
RewriteCond %{QUERY_STRING} ^(.*)wget\%20 [OR]
RewriteCond %{QUERY_STRING} ^(.*)fetch\%20 [OR]
RewriteCond %{QUERY_STRING} ^(.*)echr(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)rush=\%65\%63\%68 [OR]
RewriteCond %{QUERY_STRING} ^(.*)rush=echo [OR]
RewriteCond %{QUERY_STRING} ^(.*)esystem(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)passthru(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)\.printf\( [OR]
RewriteCond %{QUERY_STRING} ^(.*)cmd [OR]
RewriteCond %{QUERY_STRING} ^(.*)\%27(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)"(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)\%22(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)`(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)\%60(.*) [OR]
#RewriteCond %{QUERY_STRING} ^(.*)\%25(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)alert\(document(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)union(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)UNION(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)SQL_INJECTION(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)phpbb_root_path=(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)configdir(.*) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)curl(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)lynx(.*) [OR]
RewriteCond %{QUERY_STRING} ^(.*)w3\%20(.*) [OR]
RewriteCond %{HTTP_COOKIE}% s:(.*):\%22test1\%22\%3b [OR]
RewriteCond %{QUERY_STRING} .*'.* [NC]
RewriteRule ^.* - [F,L]

Наверно уже запутал совсем :) попробую объяснить ситуацию.
Файл, для которого разрешены запросы вида file.php?url=http://site.ru/.. находится в каталоге /forum/go/url.php
Для всех остальных файлов такие запросы должны возвращать ошибку.

Sham 03-02-2007 02:24 545057

Siava one
нифигасе списочек... :) только я не понял security settings относятся к url=...?
вообще, тебе лучше все в виде одной регулярки оформить... большая получится, но будет производительнее намного... типа RewriteCond %{QUERY_STRING} (wget\%20|fetch\%20|echr|rush\=\%65\%63\%68|и т.д.)
Разберешься короче :)
Код:

RewriteCond %{QUERY_STRING} ^url\=.* [NC]
RewriteCond %{REQUEST_FILENAME} !forum/go/url\.php [NC,OR]
# security settings
# .....
RewriteRule .* - [F]


Siava one 03-02-2007 15:31 545228

Sham
Всё здовово! Разобрался, спасибо за помощь :)

E-mail 24-02-2007 15:47 554662

Sham а как можно с помощью rewrite поймать урл http://mysite.ru/. или http://mysite.ru/? и перенаправить на http://mysite.ru/404.html ??

а то при набирании этих урлов я попадаю на индексный файл, а надо на 404.html..

т.е. как отловить точку и знак вопроса?

Sham 25-02-2007 09:55 554906

Код:

RewriteCond %{THE_REQUEST} [\?\.]$
RewriteRule .* 404.html [L]


E-mail 25-02-2007 13:56 555005

Sham такой код не работает(

Код:

DirectoryIndex index.html

RewriteEngine On
RewriteCond %{THE_REQUEST} [\?\.]$
RewriteRule .* 404.html [R]

при запросе http://site.ru/?

отдается:
PHP код:

GET /? HTTP/1.1
Accept
image/gif
Accept
-Languageru
Accept
-Encodinggzipdeflate
User
-AgentMozilla/4.0 (compatibleMSIE 6.0Windows NT 5.1SV1)
Hostforum.myhtml.ru
Connection
Keep-Alive

HTTP
/1.1 403 Forbidden
Date
Sun25 Feb 2007 10:49:54 GMT
Server
Apache/1.3.37 (Unix)
Connectionclose
Transfer
-Encodingchunked
Content
-Typetext/htmlcharset=iso-8859-

и при запросе при запросе http://site.ru/.

отдается:
PHP код:

GET /. HTTP/1.1
Accept
image/gif
Accept
-Languageru
Accept
-Encodinggzipdeflate
User
-AgentMozilla/4.0 (compatibleMSIE 6.0Windows NT 5.1SV1)
Hostforum.myhtml.ru
Connection
Keep-Alive

HTTP
/1.1 403 Forbidden
Date
Sun25 Feb 2007 10:52:44 GMT
Server
Apache/1.3.37 (Unix)
Connectionclose
Transfer
-Encodingchunked
Content
-Typetext/htmlcharset=iso-8859-

файла 404.html не существует, но даже если создать заголовки отдаются теже, т.е. - не работает

Sham 26-02-2007 01:40 555220

E-mail
Цитата:

RewriteRule .* 404.html [R]
полный URL надо писать, коли R ставишь...
у меня там помарочка :) Правильно так:
Код:

RewriteEngine On
RewriteCond %{THE_REQUEST} /[\?\.]\ .
RewriteRule .* 404.html? [L]


E-mail 26-02-2007 22:48 555694

Sham
Цитата:

полный URL надо писать, коли R ставишь...
ничего подобного, зависит от того что реврайте как база стоит. урл достаточно относительным этой базы писать, плюс ко всему надо не забывать экранировать спец символы, вот так например:
Код:

RewriteEngine On
RewriteCond %{THE_REQUEST} \/[\?\.]\ .
RewriteRule .* \/404\.html\? [R]

только честн говоря я не понял как работает кусок после закрывающейся квадратной скобки? о_О
и еще, почему если изменить %{THE_REQUEST} на %{REQUEST_URI} работает по разному?

E-mail 26-02-2007 23:02 555702

а на конце знак вопроса, чтобы при запросе с вопросом, вопрос отрубало?)
а почему так, происходит?:)

Sham 26-02-2007 23:52 555726

E-mail
Цитата:

ничего подобного, зависит от того что реврайте как база стоит
либо абсолютный путь с R, либо полный URL - можно без R
Цитата:

надо не забывать экранировать спец символы
ессно :) - там где регулярка, а где замена - afaik только $ и % (символы подстановки)
Цитата:

почему если изменить %{THE_REQUEST} на %{REQUEST_URI} работает по разному?
RTFM по значениям переменных
Цитата:

а на конце знак вопроса
чтобы отрубить query_string

E-mail 27-02-2007 19:09 556075

Sham
Цитата:

RTFM по значениям переменных
вот я и удивляюсь


а
Цитата:

как работает кусок после закрывающейся квадратной скобки? о_О
?:)

censore 22-12-2007 03:19 701606

Добрый день, ночь, утро...

глубого извиняюсь если баяню, не хватило терпения все перечитать.
Есть такая проблемма:
PHP код:

RewriteRule ^([a-z0–9]+)(/?)+$ /index.php?path=$[NC
RewriteRule ^([a-z0–9]+)/([^/]*)(/?)+$ /index.php?path=$1&sub=$[NC

такой вариант в принцыпе устраивал, так как в path могут помещатся куча значений в соответствии с шаблоном, так же и с sub. Только есть одно, НО

При таком раскладе обрабатываются и запросы из тела страницы к директориям:

http://site.com/i/
http://site.com/i/pageimg/
http://site.com/css/
http://site.com/js/

и естественно сробатывает подстановка описаная в примере, как можно исключить данные директории, чтобы они не обрабатывались... А то не прикольно получается... :sorry:

Sham 22-12-2007 04:03 701614

censore, первой строкой поставьте условие
Код:

RewriteCond %{REQUEST_URI} !(i|css|js)\/
и перед второй :)

censore 24-12-2007 03:31 702669

Спасибо!

LineDir 26-12-2007 23:43 704708

Доброе всем время суток)

У меня такой вопрос -
хочу все запросы типа - http://сайт/любой текст/ перенаправлять к примеру на http://сайт/index.php . Так что бы урл сохранялся , а выполнялся именно этот файл. И конечно если папка существует пере адресацию не делать.

заранее спасибо)

Sham 27-12-2007 00:06 704727

LineDir, но это будет замена 404...
Код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]


LineDir 27-12-2007 00:10 704728

Sham,

Огромнейшие спасибо!! Очень помогло)))

BASSON_XVI 14-07-2009 21:42 1167760

Есть url вида http://localhost/sse/index.php/news/news/26/ нужно получить следующее http://localhost/sse/index.php&url=/news/news/26/
Или что ещё лучше было бы сделать так что бы пути всех стилей, картинок, бакраундов и скриптов были не такие http://localhost/sse/index.php/news/...images/img.png , а такие http://localhost/sse/images/img.png.
Попробовал написать в .htaccess следующие:
Код:

RewriteEngine On
RewriteRule ^index\.php(.*)$ index.php&url=$1 [L]

Понятное дело безрезультатно! Что посоветуете?

Sham 14-07-2009 22:55 1167807

Цитата:

Цитата BASSON_XVI
RewriteRule ^index\.php(.*)$ index.php&url=$1 [L] »

1. параметры от файла отделяются знаком "?"
2. htaccess дб в папке корень/sse
Цитата:

Цитата BASSON_XVI
Или что ещё лучше было бы сделать так что бы пути всех стилей, картинок, бакраундов и скриптов были не такие http://localhost/sse/index.php/news/...images/img.png , а такие http://localhost/sse/images/img.png. »

используйте корневые (с передним слешем) или абсолютные ссылки (с доменом или тегом base в html-коде)...

BASSON_XVI 14-07-2009 23:10 1167813

Sham,
1.Параметры отделены /
2. .htaccess лежит в корень/sse/
Цитата:

используйте корневые (с передним слешем) или абсолютные ссылки (с доменом или тегом base в html-коде)...
Спасибо пока подходит :)

Sham 14-07-2009 23:26 1167819

Цитата:

Цитата BASSON_XVI
1.Параметры отделены / »

Код:

RewriteRule ^index\.php(.*)$ index.php?url=$1 [L]
Цитата:

Цитата Sham
корневые (с передним слешем) или абсолютные ссылки (с доменом или тегом base в html-коде)... »

*не ссылки а адреса в src и стилях...

strannik-06 24-07-2009 11:57 1176402

301 редирект с php на ЧПУ ссылку
 
Здравствуйте!
Возможно, эта тема уже поднималась, но бьюсь над задачей 3й день, не могу ничего найти подходящего к моему случаю.

Написал ЧПУ для сайта. Расставил на сайте ссылки вида Kategorija_1/page_1.html, в htaccess написал соот. правило

Код:

RewriteRule ^Kategorija_1/page_1.html(.*)$ index.php?&pid=107983&$1 [NC]
ЧПУ работает. Но по php ссылке index.php?&pid=107983 естественно тоже переходит. Появилась задача закрыть доступ по php ссылке, умные люди подсказали - 301 редирект. Перед первым правилом пишу в htaccess еще одно:
Код:

RewriteCond %{QUERY_STRING} ^(.+)pid=107983(.*)$
RewriteRule index.php http://mysite.com/Kategorija_1/page_1.html? [R=301,L]

Редирект срабатывает, но вот беда - после Rewrite сайт опять заглядывает в htaccess и отрабатывает первое правило. Затем заходит снова и отрабатывает второе. Происходит зацикливание.

Подскажите, как быть в этой ситуации? Возможно ли решение данной задачи вообще? Заранее спасибо!

Sham 24-07-2009 21:45 1176960

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

RewriteCond %{QUERY_STRING} pid\=107983
RewriteCond %{QUERY_STRING} !fortest\=1
RewriteRule index.php http://mysite.com/Kategorija_1/page_1.html? [R=301,L]

RewriteRule ^Kategorija_1/page_1.html$ index.php?pid=107983&fortest=1 [NC, QSA, L]

вообще то при наличии флага L в обоих правилах должно и так работать, но реальное действие этого флага мне до конца не понятно (и нигде подробного описания не нашел). т.е. есть два трактования:
1) правило последнее, и окончательный выход из всех правил;
2) только один цикл в самом правиле (а без флага L одно правило будет переписывать урл до тех пор, пока не будет совпадения).
опыт показывает, что утверждение 2 вернее...

User2010 29-07-2009 13:57 1180643

Mod Rewrite внешний вид URL сокрытие структуры сайта
 
Всем привет!
Вопрос следующий.
Проблема переадресации с помощью mod_rewrite.
имеется исходный url, например:
такой
http://www.example.com/index.php >хочется получить такой > http://www.example.com/
или
http://www.example.com/index.php?page10 >хочется получить такой > http://www.example.com/page10
или такой
http://www.example.com/index.php?xxx=yyyy&zzzz=wwww >хочется получить такой > http://www.example.com/xxx/yyyy/zzzz/wwww

или на худой конец такие:
http://www.example.com#xxx#yyyy#zzzz#wwww

Попытки решения:
1.

RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1

преобразует
http://www.example.com/xxx=yyyy&zzzz=wwww
в
http://www.example.com/index.php?xxx=yyyy&zzzz=wwww

Просто убирает индексный файл и знак вопроса из URL.

2.
Второй способ не работает:

RewriteEngine on
RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} [A-Za-z0-9]*
RewriteRule ^([A-Za-z0-9]*)$ index.php?$1

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{REQUEST_URI} [A-Za-z0-9]*#[A-Za-z0-9]*
RewriteRule ^([A-Za-z0-9]*)#?([A-Za-z0-9]*)$ index.php?$1=$2

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{THE_REQUEST} [A-Za-z0-9]*#[A-Za-z0-9]*#[A-Za-z0-9]*
RewriteRule ^([A-Za-z0-9]*)#([A-Za-z0-9]*)#([A-Za-z0-9]*)$ index.php?$1=$2&$3

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{THE_REQUEST} [A-Za-z0-9]*#[A-Za-z0-9]*#[A-Za-z0-9]*#[A-Za-z0-9]*
RewriteRule ^([A-Za-z0-9]*)#?([A-Za-z0-9]*)#?([A-Za-z0-9]*)#?([A-Za-z0-9]*)$ index.php?$1=$2&$3=$4

Не совсем понятно как сравнивать RewriteCond почему в данном примере сравнение не работает

3. Были и другие эксперименты но пока радостного мало
==================================================================

Основные сложности в том, что длинна адреса может меняться т.е.
от http://www.example.com/
до http://www.example.com/index.php?xxx=yyyy&zzzz=wwww (http://www.example.com/xxx/yyyy/zzzz/wwww)
и еще при использовании адресов типа http://www.example.com/xxx/yyyy/zzzz/wwww
браузер запрашивает файлы (css, img ...) при указании относительного адреса с базой для URL
http://www.example.com/xxx/yyyy/zzzz/wwww соотвественно http://www.example.com/xxx/yyyy/zzzz/
как лучше решить эту проблему в случае использования '/', можно использовать '#' но это не совсем то что надо.


Может знает стандартное решение данного вопроса. Буду благодарен, подскажите.

Благодарю за внимание!!!

Sham 30-07-2009 03:34 1181187

Цитата:

Цитата User2010
http://www.example.com/index.php >хочется получить такой > http://www.example.com/ »

лучше директивой
Код:

DirectoryIndex index.php
Цитата:

Цитата User2010
http://www.example.com/index.php?page10 >хочется получить такой > http://www.example.com/page10 »

Код:

RewriteRule ^page([0-9]+)$ index.php?page$1 [L]
Цитата:

Цитата User2010
http://www.example.com/index.php?xxx=yyyy&zzzz=wwww >хочется получить такой > http://www.example.com/xxx/yyyy/zzzz/wwww »

Код:

RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/([^\/]+)$ index.php?$1=$2&$3=$4 [L]
Цитата:

Цитата User2010
или на худой конец такие:
http://www.example.com#xxx#yyyy#zzzz#wwww »

так нельзя (# - рабочий символ)
Цитата:

Цитата User2010
браузер запрашивает файлы (css, img ...) при указании относительного адреса с базой для URL »

при использовании псевдостатики все относительные адреса дб корневыми (с передним слешем или доменом), либо псевдостатика дб без директорий...

d0ublezer0 29-09-2009 08:39 1230055

Привет всем. Пожалуйста помогите наладить перенаправление?
Перенесли сайт с тестового домена new.site.ru на основной домен _www.site.ru
И нужно сделать так, чтобы при обращении к тестовому домену (допустим с поисковиков) срабатывало перенаправление на основной домен.
К примеру, запрошена страница
Цитата:

new.site.ru/index.php?option=com_virtuemart&page=shop.browse
а нужно перекинуть на
Цитата:

_www.site.ru/index.php?option=com_virtuemart&page=shop.browse
Попробовал, почитав документацию и, по совету провайдера, сделать так:
Цитата:

RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteCond %{HTTP_HOST} ^new\.site\.ru [NC]
RewriteRule ^/(.*) http://www.site.ru/$1 [R=301,L]
Поместил код в .htaccess и бросил его в DocumentRoot тестового сайта.

Ничего не происходит.

Что не так?

Sham 29-09-2009 13:15 1230260

последняя строка
Код:

RewriteRule ^/?(.*)$ http://www.site.ru/$1 [R=301,L]
передний слеш, если правило в контексте сервера (в httpd.conf), в .htaccess отсекается...

Цитата:

Цитата d0ublezer0
Options +FollowSymlinks »

первой строкой лучше.

в итоге (с соблюдением регистров)
Код:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^new\.site\.ru [NC]
RewriteRule ^/?(.*)$ http://www.site.ru/$1 [R=301,L]


d0ublezer0 29-09-2009 15:24 1230370

Sham, спасибо огромное.
Тогда еще вопрос - а если страница на новом сайте не существует, то как перенаправить на главную?

Sham 29-09-2009 16:08 1230401

d0ublezer0, добавьте
Код:

ErrorDocument 404 http://www.site.ru

d0ublezer0 26-11-2009 13:59 1280351

Пожалуйста помогите с такой задачей:
посл перенастройки SEF модуля на сайте поменялись все ссылки. А по поисковым сисмемам народ приходит на "старые адреса".
нужно поправить переход. Например придя по любой из ссылок:
Код:

http://example.com/vmchk/musornyie-konteyneryi/
http://example.com/vmchk/musornyie-konteyneryi/view-all-products.html

Посетитель должен попасть на
Код:

http://example.com/musornyie-konteyneryi.html
И тоже самое для WWW в начале адреса.

Т.е. убрать из строки vmchk/ и заменить последний слеш на .html

Спасибо.

Sham 26-11-2009 20:52 1280717

Код:

RewriteRule ^vmchk\/([^\/]+) http://example.com/$1.html [R,L]

d0ublezer0 30-11-2009 14:21 1283363

Sham, спасибо, только вот еще задача - некоторые ссылки уже имеют html в конце:
/vmchk/plastikovyie-bochki-i-bidonyi.html
И получается что по вашему правилу для них формируется два расширения .html
Как переделать?

Sham 30-11-2009 14:39 1283373

Код:

RewriteRule ^vmchk\/([^\/]+)(\.html)? http://example.com/$1.html [R,L]

d0ublezer0 30-11-2009 14:50 1283383

Sham, не помогает :(
Также и ставится два расширения.
Вот весь мой htaccess
Код:

##
# @version $Id: htaccess.txt 10492 2008-07-02 06:38:28Z ircmaxell $
# @package Joomla
# @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
# @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
# Joomla! is Free Software
##


#####################################################
#  READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE
#
# The line just below this section: 'Options +FollowSymLinks' may cause problems
# with some server configurations.  It is required for use of mod_rewrite, but may already
# be set by your server administrator in a way that dissallows changing it in
# your .htaccess file.  If using it causes your server to error out, comment it out (add # to
# beginning of line), reload your site in your browser and test your sef url's.  If they work,
# it has been set by your server administrator and you do not need it set here.
#
#####################################################

##  Can be commented out if causes errors, see notes above.
Options +FollowSymLinks

#
#  mod_rewrite in use

RewriteEngine On

########## Begin - Rewrite rules to block out some common exploits
## If you experience problems on your site block out the operations listed below
## This attempts to block the most common type of exploit `attempts` to Joomla!
#
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]

RewriteRule ^vmchk\/([^\/]+)(\.html)? http://example.com/$1.html [R,L]
#
########## End - Rewrite rules to block out some common exploits

#  Uncomment following line if your webserver's URL
#  is not directly related to physical file paths.
#  Update Your Joomla! Directory (just / for root)

# RewriteBase /


########## Begin - Joomla! core SEF Section
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
#
########## End - Joomla! core SEF Section


Sham 30-11-2009 15:20 1283405

да, работает не так, как ожидалось (

тогда два варианта

1. если в именах в ссылках недопускаются точки, кроме расширений .html, то можно так
Код:

RewriteRule ^vmchk\/([^\/\.]+) http://example.com/$1.html [R,L]
2. если точки допускаются, то получится два правила

Код:

RewriteRule ^vmchk\/([^\/]+\.html)$ http://example.com/$1 [R,L]

RewriteRule ^vmchk\/([^\/]+) http://example.com/$1.html [R,L]


total_abandon 30-03-2010 14:07 1380641

Здравствуйте люди у меня такой вопрос. Есть такие правила.
Код:

RewriteRule /(.*)$ /index.php?lang=$1
RewriteRule /(.*)/(.*)$ /index.php?page=$1&amp;lang=$2

че то не работает. если удаляю первое правило, второе нормально работает но вместе - Internal Server Error.. или работает ненормально, не выводятся картинки.. посоветуйте что нибудь.

Sham 30-03-2010 14:21 1380655

ибо бесконечный цикл и мало конкретики в правилах...
+ передний слеш, если в конфиге сервера, а не htaccess, иначе уберите везде...

Код:

RewriteRule ^/([^\/]*)$ /index.php?lang=$1
RewriteRule ^/([^\/]+)/([^\/]*)$ /index.php?page=$1&amp;lang=$2


total_abandon 30-03-2010 14:44 1380669

спасибо за столь быстрый отзыв. снял слеши, Intern. Server Error. поставил слеши обратно и сделал как сказано. вот полный код.
Код:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^\/]*)$ /index.php?lang=$1
RewriteRule ^/([^\/]+)/([^\/]*)$ /index.php?page=$1&amp;lang=$2

так вообще обе правила не работают. у меня всe w .htaccess.

Sham 30-03-2010 15:01 1380677

уточните условия, непонятно, что требуется...
у вас на первое RewriteRule действуют 2 верхних условия RewriteCond (что не файл и не папка), а второе RewriteRule по-любому работает...

total_abandon 30-03-2010 15:05 1380678

вообщем у меня такая штука, есть index.php?page=Products&lang=rus и index.php?lang=rus . нужно чтоб они работали если в первом случае то site.com/products/rus, и site.com/rus соответственно. как именно сделать чтоб работало, ссылки на сайте изменены соответсвенным образом.

Sham 30-03-2010 15:23 1380693

по идее достаточно этих строк (без всего остального)
Код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(([^\/]+)\/)?([^\/]+)$ index.php?page=$2&amp;lang=$3 [L]

хотя и от самого скрипта index.php зависит тоже...

RewriteCond - это на случай если такой реальный путь существует (чтобы не было конфликтов)...

total_abandon 30-03-2010 15:35 1380699

а что index.php ??он у меня получает данные методом GET и все, но что-то не хочет работать чертов mod_rewrite.
у меня работает тока так.
Код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /(*.)/(*.)$ /index.php?page=$1&lang=$2

и только с двумя переменными в адресной строке, все работает и картинки и ссылки.. но как только ссылка типа index.php?lang=rus сразу not found ...

Sham 30-03-2010 16:02 1380715

у меня правило рабочее (проверено), только небольшие поправки (см. пост выше)...

total_abandon 30-03-2010 16:05 1380722

может нужны какие то доп. настройк чтоб твой код работал у меня?? у меня апач 2.2.9

Sham 30-03-2010 16:12 1380724

Цитата:

Цитата total_abandon
а что index.php ?? »

в смысле, как скрипт определяет пустые GET-переменные (isset/empty). В том случае isset - true, и empty - true (переменная существует, но пустая), а если с двумя правилами, то isset - false, а empty - true (мб переменной не существовать в одном правиле)... т.е. если везде empty, то надежнее...

Цитата:

Цитата total_abandon
нужны какие то доп. настройк чтоб твой код работал у меня?? »

никаких

вот .htaccess

Код:

Options +FollowSymLinks
RewriteOptions MaxRedirects=3

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(([^\/]+)\/)?([^\/]+)$ index.php?page=$2&amp;lang=$3 [L]


total_abandon 30-03-2010 16:46 1380749

нет у меня типа этого. -
Код:

$page = $_GET['page'];
if(page == "products")
{
...
}


Sham 30-03-2010 17:45 1380788

Цитата:

Цитата total_abandon
if(page == "products") »

$page (ошибочка)

если $_GET['page'] не существует, то будет e_notice. Нужно проверять наличие (empty/isset).

хотя можно и заткнуть (@$_GET['page'])

droZel 30-03-2010 18:39 1380854

Здравствуйте. Уже третий день парюсь, ничего не могу поделать.
Делаю ЧПУ с помощью mod_rewrite.
Мне нужно, чтобы ссылки site.ru/ru/page ссылались на index.php?lang=ru&page=page
При отсутствии последней переменной пусть посылается только одна.

.htaccess:

Код:

DirectoryIndex /ru/
 
RewriteEngine On
RewriteBase /
 
RewriteRule ^([A-Za-z]+)/?$ index.php?lang=$1 [L]
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/?$ index.php?lang=$1&page=$2 [L]

все хорошо, переменные присылаются, но также подменяются и папки, тоесть при запросе site.ru/ru/about/

мы какбы находимся в папке ru/about.
Со всеми вытекающими: не находит страницы и стили.
Заранее благодарен)

Sham 30-03-2010 19:39 1380904

можно добавить проверку на наличие файла (или другие условия),

Код:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z]+)(/([A-Za-z]+))?/?$ index.php?lang=$1&page=$3 [L]

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

Код:

RewriteRule ^(ru|en)/?$ index.php?lang=$1 [L]
RewriteRule ^(ru|en)/(page|other)/?$ index.php?lang=$1&page=$2 [L]


droZel 31-03-2010 04:57 1381228

Ну это все варианты варианты, но меня мучает один вопрос.
Почему /ru/page1/ он пересылает в файл, но ../ для него становится этими папками?

total_abandon 31-03-2010 08:46 1381279

у меня вообще не работает код sham-а, только работает указанный мною, все эты скобки, квадратные круглые все это не работает. мне нужно чтоб нормально работали эти два правила вместе... но никак .... одно правило со всем справляется тока когда меняешь язык и остается одна переменная GET выдает что не найденна такая папка на сервере... посоветуйте что нибудь все перепробовал.

Sham 31-03-2010 14:47 1381542

Цитата:

Цитата droZel
Почему /ru/page1/ он пересылает в файл, но ../ для него становится этими папками? »

если вопрос об относительных ссылках на css, скрипты и картинки, то безусловно они не будут работать, поскольку для браузера это директории, хоть и псевдо. Поэтому все относительные ссылки надо заменить на корневые, с передним слешем... <script src="/file.js">

Цитата:

Цитата total_abandon
у меня вообще не работает код sham-а, только работает указанный мною, все эты скобки, квадратные круглые все это не работает. »

читайте логи сервера, смотрите настройки, мб у вас htaccess вообще запрещены, а работают правила, прописанные в конфиге... у DirectoryIndex непонятное значение...

Если код не работает у вас, это не значит, что он неправильный.

Sham 31-03-2010 15:05 1381555

нужно уточнить насчет последнего слеша, т.к. правило не предусматривает его наличие, поэтому если в конце адреса будет слеш, правило не сработает... (нужно добавить туда /?)

droZel 31-03-2010 15:49 1381600

Такс. Первая проблема решена, спасибо)
Теперь еще мелочь:
htaccess тот же
Код:

RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z]+)/?$ index.php?lang=$1 [L]
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/?$ index.php?lang=$1&page=$2

site.ru/ru/ отправляется отлично
site.ru/ru/page также, как и site.ru/ru/page/
а вот site.ru/ru отправляет, но в строке тут же меняет на "http://siberiaczar/ru/?lang=ru"

С чем бы это могло быть связано?

И еще, как сделать что о вроде редиректа, чтоб /ru/page автоматически менялось на /ru/page/

total_abandon 31-03-2010 16:06 1381616

Sham я не сказал что код нерабочий, смотри выше. я сказал что он у меня не работает и спросил о доп настройках которые могут помешать нормальной работе mod_rewrite- а, пожалуйста напишите что конкретно должно быть у меня в настройках апач, у меня стоит Lenny.

Sham 31-03-2010 16:32 1381645

Цитата:

Цитата droZel
И еще, как сделать что о вроде редиректа, чтоб /ru/page автоматически менялось на /ru/page/ »

Код:

RewriteRule ^([A-Za-z]+)/([A-Za-z]+)$ http://%{HTTP_HOST}/$1/$2/ [L]
Цитата:

Цитата droZel
а вот site.ru/ru отправляет, но в строке тут же меняет на "http://siberiaczar/ru/?lang=ru" »

это у вас где-то прописан редирект, в указанных правилах такое невозможно...

вообще, если например стоит nginx, то там мб свои правила прописаны, и апач тогда уже принимает измененный вариант. Т.ч. нужно смотреть комплексно, исходя из общей конфигурации...
Цитата:

Цитата total_abandon
о доп настройках которые могут помешать нормальной работе mod_rewrite »

проверено на конфиге по умолчанию... смотрите настройки хоста в httpd.conf, правила в nginx, если есть..

droZel 31-03-2010 16:46 1381658

Цитата:

Цитата Sham
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)$ http://%{HTTP_HOST}/$1/$2/ [L] »

Перенаправляет, но не заменяет в строке...

Sham 31-03-2010 16:54 1381668

оно перед всеми правилами должно стоять (внешний редирект)

droZel 31-03-2010 16:58 1381671

Цитата:

Цитата Sham
оно перед всеми правилами должно стоять (внешний редирект) »

Перед какими? Там же [L] стоит? Разве это не значит, что после него ниче не станет выполняться?
Можно чуть подробнее?

Sham 31-03-2010 17:06 1381678

Цитата:

Цитата droZel
Там же [L] стоит? Разве это не значит, что после него ниче не станет выполняться? »

L - это внутренний флаг правила (хотя из мануала это не ясно, но опыт показывает). Т.е. L запрещает повторную перезапись внутри правила, и переход идет на следующее (исходя из других флагов).

droZel 31-03-2010 17:24 1381693

ну хорошо. но ведь
Код:

RewriteRule ^([A-Za-z]+)/([A-Za-z]+)$ http://%{HTTP_HOST}/$1/$2/ [L]
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/$ index.php?lang=$1&page=$2

не подменяет в строке /ru/page на /ru/page/, а всего лишь понимает их одинаково.
я мог бы сделать
Код:

RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/?$ index.php?lang=$1&page=$2
Разве это не тоже самое?
Мне нужна именно видимая подмена

Sham 31-03-2010 17:29 1381700

http:// - внешний редирект (по сути флаг R), т.е. браузеру шлется Location и обработка кончается - это и есть видимая подмена.

droZel 31-03-2010 17:34 1381705

Странно, у меня не подменяет, хотя без этого правила ru/page не находит(значит, правило действует как надо, но без подмены).
Проверяю в индексе явой(document.location.pathname) - так и присылает - без слеша
Где копать?

total_abandon 01-04-2010 11:21 1382319

как только открываю сайт в логах следующее
Код:

10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98e3508/initial] (1) [perdir /var/www/] pass through /var/www/ceramica/
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98f2540/subreq] (1) [perdir /var/www/] pass through /var/www/ceramica/index.php
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98f0538/initial] (1) [perdir /var/www/] pass through /var/www/ceramica/index.css
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98e5510/initial] (2) [perdir /var/www/] rewrite 'ceramica/img/copyright_back.jpg' -> '/index.php?page=img&lang=copyright_back.jpg'
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98e5510/initial] (2) [perdir /var/www/] trying to replace prefix /var/www/ with /
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98e5510/initial] (1) [perdir /var/www/] internal redirect with /index.php [INTERNAL REDIRECT]
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98eb918/initial/redir#1] (1) [perdir /var/www/] pass through /var/www/ceramica/index.php
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98ea520/initial] (2) [perdir /var/www/] rewrite 'ceramica/swf/home.swf' -> '/index.php?page=swf&lang=home.swf'
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98ea520/initial] (2) [perdir /var/www/] trying to replace prefix /var/www/ with /
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98ea520/initial] (1) [perdir /var/www/] internal redirect with /index.php [INTERNAL REDIRECT]
10.10.0.188 - - [01/Apr/2010:16:14:46 +0500] [192.168.55.230/sid#9747bd8][rid#98f1908/initial/redir#1] (1) [perdir /var/www/] pass through /var/www/ceramica/index.php

может че нить станет ясно???

Sham 01-04-2010 12:45 1382392

имхо RewriteBase у вас не '/', из-за этого проблемы.

Т.е. если htaccess лежит в корне, то попробуйте убрать RewriteBase. Правило мое возьмите (там проверка на наличие файла), а то у вас
Цитата:

Цитата total_abandon
rewrite 'ceramica/swf/home.swf' -> '/index.php?page=swf〈=home.swf' »

запросы на реальные файлы изменяет...
Цитата:

Цитата total_abandon
internal redirect with /index.php [INTERNAL REDIRECT] »

непонятные внутренние редиректы (из-за передних слешей)

total_abandon 01-04-2010 13:17 1382415

у меня "RewriteBase /", .htaccess лежит в /var/www a сам сайт в /var/www/ceramica. снял RewriteBase / - вообще стал не работать. .поставил настройки все как sham сказал, теперь сразу редиректит на 2 страницу и ненормально работает, то есть ссылки и тд не работают. вот логи.
Код:

10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98ec528/initial] (2) [perdir /var/www/] rewrite 'ceramica/' -> 'index.php?page=ceramica&lang='
10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98ec528/initial] (2) [perdir /var/www/] trying to replace prefix /var/www/ with /
10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98ec528/initial] (1) [perdir /var/www/] internal redirect with /index.php [INTERNAL REDIRECT]
10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98f57b0/initial/redir#1] (1) [perdir /var/www/] pass through /var/www/ceramica/index.php
10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98f4548/initial] (1) [perdir /var/www/] pass through /var/www/ceramica/img/titles/ceramica.gif
10.10.0.188 - - [01/Apr/2010:18:11:51 +0500] [192.168.55.230/sid#9747bd8][rid#98fa560/initial] (1) [perdir /var/www/] pass through /var/www/ceramica/swf/ef_ceramica.swf


Sham 01-04-2010 13:54 1382436

имхо у вас дб
Код:

RewriteBase /ceramica
(если /var/www/ - document_root)
либо положите htaccess в ceramica
Цитата:

Цитата total_abandon
поставил настройки все как sham сказал »

настройки лучше делать по мануалу...

total_abandon 02-04-2010 14:06 1383336

спасибо, стало работать, но не все, в ие-6,7, опера10, хроме - ок, а в мозилле че то не выводит флеши некоторые.
извините а что означает следующий лог?

Код:

192.168.155.32 - - [02/Apr/2010:14:55:45 +0500] [192.168.55.230/sid#8634bd8][rid#87d0508/initial] (2) [perdir /var/www/ceramica/] rewrite 'partners/rus' -> 'index.php?page=partners&lang=rus'
192.168.155.32 - - [02/Apr/2010:14:55:45 +0500] [192.168.55.230/sid#8634bd8][rid#87d0508/initial] (2) [perdir /var/www/ceramica/] trying to replace prefix /var/www/ceramica/ with /
192.168.155.32 - - [02/Apr/2010:14:55:45 +0500] [192.168.55.230/sid#8634bd8][rid#87d0508/initial] (1) [perdir /var/www/ceramica/] internal redirect with /index.php [INTERNAL REDIRECT]
192.168.155.32 - - [02/Apr/2010:14:55:45 +0500] [192.168.55.230/sid#8634bd8][rid#87d38f8/initial/redir#1] (1) [perdir /var/www/ceramica/] pass through /var/www/ceramica/index.php


kamaikin 03-04-2010 08:09 1383984

Доброго дня! Помогите пожалуйста с проблемой.
на сайте есть URL типа: /image/small/ki436j9j.jpg
Его нужно преобразовать к урлу: cache/image/small/{Первые два символа$1}/$1.jpg
А если такого файла нет то перенаправить на скрипт image.php

Пытаюсь сделать так:

RewriteRule ^image/small/([a-z0-9_]+).jpg(/?)+$ cache/image/small/{Здесь споткнулся((((}/$1.jpg [L]
RewriteRule ^image/(small|big|original|pda)/([a-z0-9_]+).(jpg|png|gif)(/?)+$ images.php?size=$1&name=$2&ext=$3 [L]


Может быть сможете помочь?

droZel 04-04-2010 08:00 1384627

Код:

RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/$ index.php?lang=$1&page=$2 [L]
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)$ http://%{HTTP_HOST}/$1/$2/ [R,N]
RewriteRule ^([A-Za-z]+)$ http://%{HTTP_HOST}/$1/about/ [R]
RewriteRule ^([A-Za-z]+)/$ index.php?lang=$1&page=about [L]
RewriteRule ^$ http://%{HTTP_HOST}/ru/about/ [N]

Почему после введения "site.ru/" он примеряет на них все правила попорядку?
Разве этот запрос удовлетворяет первому правилу?
Код:

127.0.0.1 - - [04/Apr/2010:12:19:45 +0700] [site/sid#87a6a8][rid#8d0d30/initial] (3) [perdir C:/Sites/home/site/www/] applying pattern '^([A-Za-z]+)/([A-Za-z]+)/$' to uri ''
Смысл - site/ заменять реальным site/ru/about/ и отправлять соответствующий запрос, site/ru заменять на site/ru/about/, ну и добавлять слеши где их нет в конце.
Заранее благодарен за помощь)

Sham 04-04-2010 15:30 1384850

Цитата:

Цитата kamaikin
RewriteRule ^image/small/([a-z0-9_]+).jpg(/?)+$ cache/image/small/{Здесь споткнулся((((}/$1.jpg [L] »

Код:

RewriteRule ^image/small/([a-z0-9_]{2})([a-z0-9_]+)\.jpg$ cache/image/small/$1/$2.jpg [L]
Цитата:

Цитата droZel
[N] »

зачем флаг N?

kamaikin 04-04-2010 19:19 1384952

Цитата:

Цитата Sham
Цитата kamaikin:
RewriteRule ^image/small/([a-z0-9_]+).jpg(/?)+$ cache/image/small/{Здесь споткнулся((((}/$1.jpg [L] »
Код:
RewriteRule ^image/small/([a-z0-9_]{2})([a-z0-9_]+)\.jpg$ cache/image/small/$1/$2.jpg [L]

Спасибо за первую часть решения, заработало вот так:
RewriteRule ^image/small/([a-z0-9_]{2})([a-z0-9_]+)\.jpg(/?)+$ cache/image/small/$1/$1$2.jpg
аостался второй вопрос если этого файла нет то должно выполняться перенаправление следующим образом
RewriteRule ^image/(small|big|original|pda)/([a-z0-9_]+).(jpg|png|gif)(/?)+$ images.php?size=$1&name=$2&ext=$3 [L]

Sham 04-04-2010 19:30 1384954

Цитата:

Цитата kamaikin
если этого файла нет то должно выполняться перенаправление »

перед правилом дб условие
Код:

RewriteCond %{REQUEST_FILENAME} !-f

kamaikin 04-04-2010 22:51 1385057

Цитата:

Цитата Sham
Цитата kamaikin:
если этого файла нет то должно выполняться перенаправление »
перед правилом дб условие
Код:
RewriteCond %{REQUEST_FILENAME} !-f »

Не работает ни так:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^image/small/([a-z0-9_]{2})([a-z0-9_]+)\.jpg(/?)+$ cache/image/small/$1/$1$2.jpg [L]
RewriteRule ^image/(small|big|original|pda)/([a-z0-9_]+).(jpg|png|gif)(/?)+$ images.php?size=$1&name=$2&ext=$3 [L]

ни так:
RewriteRule ^image/small/([a-z0-9_]{2})([a-z0-9_]+)\.jpg(/?)+$ cache/image/small/$1/$1$2.jpg [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^image/(small|big|original|pda)/([a-z0-9_]+).(jpg|png|gif)(/?)+$ images.php?size=$1&name=$2&ext=$3 [L]

Без [L] тоже пробовал(((

Sham 05-04-2010 00:37 1385123

RewriteCond действует только на следующий RewriteRule
экранируйте точку, и
Цитата:

Цитата kamaikin
(/?)+ »

это глупость...
Цитата:

Цитата kamaikin
Без [L] тоже пробовал((( »

L в основном ставится для перестраховки от зацикливания, но в этом правиле оно не грозит.

kamaikin 05-04-2010 06:37 1385167

Sham! Вы уж простите клинического идиота, но никак не могу заставить работать.... или если файла нет выкидывает 404 или всегда отрабатывает скрипт....

Sham 05-04-2010 15:20 1385445

kamaikin, у вас два правила фактически одинаковые (могут совпадать на один урл), поэтому путаница. имхо можно местами поменять (правило с RewriteCond на первое место), либо поискать другое решение, более ясное. тут вам никто не помощник, ибо все нюансы известны только вам...

droZel 05-04-2010 15:21 1385446

Цитата:

Цитата Sham
зачем флаг N? »

чтобы от второго правила вернуться к первому, если не стоит слеш в конце, он его добавляет, а обработчик строки о слешем - первое правило. Я неправильно понимаю?
Почему при ссылке href="/ru/page2", он отправляет запрос верно, но в строке адреса ничего не меняется?

Sham 05-04-2010 15:32 1385457

Цитата:

Цитата droZel
чтобы от второго правила вернуться к первому »

неправильно. там где http:// или [R] - значит клиенту отправляется заголовок Location и процесс завершается.

мануал (перевод) можно тут почитать, хотя имхо не идеальный...

appc 02-07-2010 14:09 1445962

Пожалуйста, подскажите такую вещь:

Нужно все урлы вида
/asdfasfd.html
Преобразовывать в
/asdfasfd.html?parameter=znach

Вставил в конфиг апача:
RewriteRule (.*)\.html$ $1.html?parameter=znach [R]

Браузер выдает:
Ошибка 310 (net::ERR_TOO_MANY_REDIRECTS): Обнаружено слишком много переадресаций.

Если в конфиге апача пишу:
RewriteRule (.*)\.html$ $1.html?parameter=znach [L]
Тогда не работает перенаправление.

Помогите пожалуйста понять как сделать правильно.

Sham 02-07-2010 22:27 1446270

циклит, потому что шаблон слишком общий и нет флага L (R - для внешнего редиректа), нужно условие или более конкретный шаблон.

Код:

RewriteCond %{QUERY_STRING} !parameter\=znach
RewriteRule ^(.*)\.html$ $1.html?parameter=znach [L]


appc 03-07-2010 13:01 1446481

Цитата:

Цитата Sham
RewriteCond %{QUERY_STRING} ! »

Спасибо.

Я ещё тупанул ... это не единственное правило ... поставил его в самый верх... и заработало.

Artem-Samsung 11-07-2010 03:35 1451059

В каком то из скриптов Wordpress, взял пример .htaccess для того что бы любой адрес, который обращается к веб-серверу обращался к файлу index.php

Код:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Но мне нужно вписать еще строку, типа:
Код:

RewriteRule captcha.jpg /modules/captcha.php
Куда не втыкну, не получается.
Все равно все ссылается на index.php

Если вставить просто код:
Код:

DirectoryIndex index.php
Options +FollowSymlinks
RewriteEngine On

RewriteRule captcha.jpg /modules/captcha.php

, то работает, но нужно еще сохранить ту настройку, что бы любой адрес обращался к одному файлу

Sham 11-07-2010 04:37 1451067

Цитата:

Цитата Artem-Samsung
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d »

третьим можно добавить
Код:

RewriteCond %{REQUEST_URI} !captcha\.jpg
и свое потом куда угодно.
или сделайте файл captcha.jpg и положите куда надо (проверка идет на отсутствие файла и папки).

maasja 10-01-2011 20:05 1585480

Здравствуйте.
Есть сайт. Он доступен по двум адресам: один адрес - домен сайта , второй адрес - сервисный адрес сайта. Мне нужно чтобы при переходе на домен сайта, он его перенаправлял на сервисный адрес сайта, причем так чтобы, все что после домена сайта, переносилось на сервисный адрес сайта, например:
Код:

www.site.com    redirect -->  www.service_address.com
www.site.com/home.html    redirect -->  www.service_address.com/home.html
www.site.com/css/style.css  redirect -->  www.service_address.com/css/style.css

первое что пришло в голову это на .htaccess следующей код:
Код:

Options +FollowSymLinks
RewriteEngine On
RewriteRule (.*) http://www.service_address.com/$1 [R=301,L]

, но поскольку два адреса сайта работают с одной директории, то получается вечный редирект. Как это сделать(желательно с помощью .htaccess)?
Большое спасибо..

Sham 11-01-2011 07:29 1585844

нужно условие добавить
Код:

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

или так попробовать (чуть быстрее вроде)
Код:

RewriteCond %{HTTP_HOST} ^(www\.)?site\.com$
RewriteRule .? http://www.service_address.com%{REQUEST_URI} [R=301,L]


maasja 11-01-2011 12:22 1586015

Sham, большое спасибо!!
кстати, маленький вопрос, уже давно хотел знать на него ответ.
Обязательно ли перед точками ставить слеш
Цитата:

Цитата Sham
^(www\.)?site\.com$ »

?
Часто в статьях или еще где-то перед точками стоит слеш, но когда я сам пишу правила, то их не ставлю, и вроде работает))
Только что удалил слеши из выше написанного примера, и тоже работает)

P.S. если вместо www, может быть любое значение, то писать так:
Код:

RewriteCond %{HTTP_HOST} ^(.\.)?site\.com$
?
Спасибо.

Sham 11-01-2011 12:37 1586028

Цитата:

Цитата maasja
если вместо www, может быть любое значение »

Код:

RewriteCond %{HTTP_HOST} site\.com$
. - любой символ, в т.ч. и точка, поэтому нужно экранировать. rtm.

maasja 11-01-2011 13:33 1586070

Sham, как всегда большое спасибо)
Код:

RewriteCond %{HTTP_HOST} site\.com$
код почему-то не работает, а так работает
Код:

RewriteCond %{HTTP_HOST} .site\.com$
..

Sham 12-01-2011 12:48 1586825

вопрос в содержимом %{HTTP_HOST}, куда смотрит регексп. Точка там ничего не решает, слева нет якоря на начало ^.

velocat 16-01-2011 08:47 1589698

Подскажите знающие, всю голову уже сломал...
Как сделать редирект с домена в РФ

Нужно, чтобы

домен.рф
domain.ru

перенаправлялись на: domain.ru/doc/

плюс желательно "doc" скрыть.

Sham 16-01-2011 14:31 1589855

не забудьте, что кириллические домены шлются в punycode (ссылка на конвертер внизу есть).

Lossless.Senator 11-04-2012 11:45 1897532

Подскажите пожалуйста.
Имею два вопроса. В данный момент в .htaccess прописано:

Код:


RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php$
RewriteRule ^(.*)$ $1.php

1. При написании адреса без "php", переход на неё осуществляется нормально и расширение не отображается в адресной строке, НО, при следующем переходе на сайте по ссылке, например сайт.ru/browse.php, расширение уже прописывается.

2. Хочу чтобы для *.html, *.htm файлов выше описанное тоже распространялось. Подскажите пожалуйста код.

Заблаговременно спасибо.

Sham 11-04-2012 20:45 1897863

Цитата:

Цитата Lossless.Senator
для *.html, *.htm файлов выше описанное тоже распространялось »

для каждого расширения две строки
Код:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.+$ $0.php [L]

Цитата:

Цитата Lossless.Senator
например сайт.ru/browse.php, расширение уже прописывается »

непонятно, что нужно

Lossless.Senator 12-04-2012 06:49 1898034

Sham
Спасибо. По поводу второго видимо это не представляется возможным. Я предполагал что реврайт может вырезать расширения при переходе с одной ссылки на другую.

Sham 12-04-2012 07:40 1898045

Через внешний редирект, поэтому как можно выше.
Код:

RewriteCond %{THE_REQUEST} \.(?:php|html?)[\?\ ]
RewriteRule ^/?(.+)\.(?:php|html?)$ http://%{HTTP_HOST}/$1 [R,L]

Это лишняя нагрузка. Можно без RewriteCond, но с флагами END на правилах выше (только последние версии апача).

Lossless.Senator 12-04-2012 08:58 1898078

Sham
Большое спасибо! Это работает и выглядит хорошо. Процитирую то, что мне ответили по этому коду на другом ресурсе:

Цитата:

ну вы хотите, чтобы у вас все ссылки были с .php, и при каждом запросе делать редирект на адрес без расширения, да еще и 302?

подобные вещи надо на крайний случай делать.
я в своем движке реализовал работу без расширений, но у меня помимо переадресации ссылки с расширением на ссылку без нее (при этом я сделал и проверку существования файла), движок загоняет в буфер html код страницы, а потом обрабатывает его корректируя ссылки.

кстати, у вас возникнет в этой ситуации проблема с POST данными - они просто потеряются при переадресации.
Всё же хочется реализовать работу без расширений без особого ущерба для производительности и просто сделать это максимально корректно.

Sham 12-04-2012 20:14 1898487

Цитата:

Цитата Lossless.Senator
проблема с POST данными - они просто потеряются при переадресации. »

добавьте условие
Код:

RewriteCond %{REQUEST_METHOD} =GET
и в атрибутах action форм указывайте адрес в нужном/правильном виде. Если есть POST-запросы в ajax, то и там поправьте пути.

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

Lossless.Senator 22-04-2012 19:06 1904113

Скажите пожалуйста, является ли такой редирект на https нормальным или есть более лучший способ?

Код:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}


Sham 22-04-2012 20:17 1904132

Подмаски и жадные квантификаторы тут не нужны, и текст в условии можно просто сравнить. И флаги не помешают.
Оптимизируем.
Код:

RewriteCond %{HTTPS} =off
RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


Lossless.Senator 22-04-2012 20:36 1904146

Как всегда благодарю, Sham

Lossless.Senator 24-04-2012 18:23 1905169

Как сделать чтобы при таком коде

Код:

RewriteRule ^PRIMER$ browse.php [L]
в адресной строке отображалось именно PRIMER.

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


Время: 15:04.

Время: 15:04.
© OSzone.net 2001-