Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование Web серверов и Web служб > mod_rewrite Нужное каждому.


Автор: Всемогущий 10.5.2007, 06:45
Обсуждение моей проблемы я видел во многих местах,но нигде не было нормального ответа.
нужно:
есть папка с файлами и папками,
если идёт обращение к существующему файлу то 
тогда переадресовываем запрос на index.php в этой папке RewriteRule ^.*$ /index.php?%{REQUEST_URI}
и второе правило: если обращаются к поддеректории либо к файлу в поддиректории то mod_rewrite ничего не делает.

Надеюсь на вашу помощь.

Автор: Daevaorn 10.5.2007, 09:17
А документацию почитать лень?

Автор: Всемогущий 10.5.2007, 15:50
Цитата(Daevaorn @  10.5.2007,  11:17 Найти цитируемый пост)
А документацию почитать лень?

а по уважительнее нельзя?

Автор: Сумасшедший 10.5.2007, 18:32
Уважаемый Всемогущий, а не соизволите ли Вы обратить свой взор с вершин блаженно-халявных к делам насущным и усладить свой взор небольшим отрывком из документации по mod_rewrite, который утолит Вашу жажду познаний и поможет решить вечный вопрос "ктобы сделал за меня"?

Автор: Всемогущий 10.5.2007, 20:31
Сумасшедший,  smile 
я давно на этом сайте,и знаю что здесь не любят халявщиков.
Из моей репутации видно что  я не только спрашиваю,

Сумасшедший, пожалуйста найди мне линк с описанием именно моей проблемы
чтобы я 
Цитата(Сумасшедший @  10.5.2007,  20:32 Найти цитируемый пост)
 обратить свой взор с вершин блаженно-халявных к делам насущным и усладить свой взор небольшим отрывком из документации по mod_rewrite


Автор: xolod 10.5.2007, 21:43
Первый линк по запросу "mod_rewrite" в русскоязычном Гугле (и в Яндексе, кстати, тоже) указывает на http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html. Если его вдумчиво прочитать, особенно раздел про RewriteCond, все должно встать на места.

Давать линки на англоязычные ресурсы с расширенным материалом специально не стал, пониманию это явно не поспособствует.

Автор: Всемогущий 10.5.2007, 23:47
это всё конечно  здорово,
примерно такие ответы я видел везде ,куда меня приводил поиск
эти сайты я уже видел,


раз это так просто,так напишите пожалуйста эти 4 строки

p.s

мне это нужно для напсания статьи для винграда

Автор: Alexey007 11.5.2007, 20:14
Представляете, мне тоже это нужно(для моего движка). Читал документацию, вроде всё понял, но...
Пожалуйста объясните на русском smile 

Автор: xolod 12.5.2007, 12:43
Хорошо, давайте попробуем разобраться. Объясните на пальцах, что вы хотите. Потому как с моей и ворда точек зрения
Цитата(Всемогущий @  10.5.2007,  06:45 Найти цитируемый пост)
...есть папка с файлами и папками ... к существующему файлу то 
тогда переадресовываем запрос на index.php в этой папке ... если обращаются к поддеректории либо к файлу в поддиректории то mod_rewrite ничего не делает...

предложение не согласовано.

Попробую предположить: если обращение происходит к файлу в корне сайта, переадресовываем на index.php в корне сайта. Если обращение глубже корня, то ничего не делаем. Так?

Автор: Всемогущий 12.5.2007, 16:43
да,и если обращение к index.php тоже ничего не делаем smile 

Автор: GZep 12.5.2007, 17:42
Я правильно понимаю:
если обращение идет на папку (например: some.ru/news/) то надо, чтобы был произведен редирект на index.php (например: some.ru/news/index.php) ???

Автор: Всемогущий 12.5.2007, 18:01
не принципиально ,пусть ничего не происходит.

Автор: GZep 12.5.2007, 18:21
Всемогущий, так что делать? какой неявный редирект?
Цитата(xolod @  12.5.2007,  12:43 Найти цитируемый пост)
предложение не согласовано.

чтобы правильно задать вопрос, надо знать хотябы половину ответа(с). Не все знают половину ответа на свои вопросы.

Автор: Всемогущий 12.5.2007, 18:24
Цитата(xolod @  12.5.2007,  14:43 Найти цитируемый пост)
Попробую предположить: если обращение происходит к файлу в корне сайта, переадресовываем на index.php в корне сайта. Если обращение глубже корня, то ничего не делаем. Так?


именно так

Автор: GZep 12.5.2007, 18:58
а это не mod_rewrite делает. На сколько я понял должно помочь вот это: http://htaccess.net.ru/doc/htaccess/directoryIndex.php.

Автор: Всемогущий 12.5.2007, 19:12
мне кажется не то ,так как 

нужно

http://site.ru/somefile.ext(любой файл в корне) стало http://site.ru/index.php?file=somefile.ext

а если что угодно находится находится глубже корня ничего не происходит

http://site.ru/*****/somefile.ext  - ничего

Автор: GZep 12.5.2007, 19:23
усе, понял. Делаем:
важное замечание: если так делать то надо снять обязательно редирект с файла index.php. Если не сделать, то будет происхоить следующее:
запрос к файлу /news.php
выполняется редирект к файлу index.php вот так:
/index.php?file=news.php
НО редирект не останавливается и идет дальше(мы же теперь обращаемся к index.php):
/index.php?file=index.php&file=news.php
и так далее:
/index.php?file=index.php&file=index.php&file=news.php
пока сервер не зависнет... smile 
Это надо учитывать и сделать игнор файлу index.php (делаем это при помощи RewriteCond %{REQUEST_FILENAME} !-f)

Итого имеем:
Код

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^([a-z_]+)\.[a-z]+(\?(.*))?$ index.php?file=$1$3 [NC,QSA]
</IfModule>

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

Теперь папки (в этом я не уверен!)
там вроде надо просто:
Код

<IfModule mod_rewrite.c>
    RewriteEngine off
</IfModule>

Усе! smile 

Автор: Всемогущий 12.5.2007, 19:43
http://www.gazetron.ru/del/

нажимаю на файл ничего не происходит

кажется ошибка здесь :

  RewriteCond %{REQUEST_FILENAME} !-f #не файл

мне же нужно было чтоб он Жрал все файлы,

а если поставить

  RewriteCond %{REQUEST_FILENAME} -f #любой файл

то он обрабатывает файлы не только в корне ,но и везде





Автор: xolod 12.5.2007, 23:23
Код

RewriteEngine On
Options +FollowSymLinks

RewriteBase /

RewriteCond %{REQUEST_URI} ^\/[^/]+$
RewriteRule ^(.*) index.php?p=$1 [L,QSA]

В файл .htaccess в корне сайта. В httpd.conf %{VARIABLE} использовать можно не всегда.

Автор: Всемогущий 13.5.2007, 06:43
я до сих пор легко получаю доступ к файлам которые лежат рядом с index.php

http://gazetron.ru/del/rewrite.txt

где же 
Цитата(Всемогущий @  12.5.2007,  21:12 Найти цитируемый пост)
http://site.ru/somefile.ext(любой файл в корне) стало http://site.ru/index.php?file=somefile.ext


Автор: GZep 13.5.2007, 09:32
Цитата(Всемогущий @  12.5.2007,  19:43 Найти цитируемый пост)
мне же нужно было чтоб он Жрал все файлы,

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

Добавлено через 1 минуту и 57 секунд
чуть попозже освобожусь и посмотрю, что там не работает.

Автор: Всемогущий 13.5.2007, 11:15
Цитата(GZep @  13.5.2007,  11:32 Найти цитируемый пост)
 Все файлы он жрать не должен.


Должен,только в корне.

Автор: xolod 13.5.2007, 15:00
Кажется мы с вами не понимаем друг друга.
Воссоздайте структуру на своем сервере, такую как в архиве (просто распокавав архив в корень сервера, лучше если там ничего больше не будет, для чистоты эксперимента).
Там есть файлы в корне (file.html, twofile.txt) и папка dir с файлами. Попробуйте открыть каждый из них в браузере.
Структура должна быть воссоздана от корня (DOCUMENT_ROOT, htdocs, etc), а не в какой-либо поддиректории.

Автор: Всемогущий 13.5.2007, 15:21
Цитата(xolod @  13.5.2007,  17:00 Найти цитируемый пост)
Структура должна быть воссоздана от корня (DOCUMENT_ROOT, htdocs, etc), а не в какой-либо поддиректории.
начальник не поймёт smile 

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



Цитата(xolod @  13.5.2007,  17:00 Найти цитируемый пост)
Кажется мы с вами не понимаем друг друга.

мне тоже кажется,
наверное правда бывают затмения разума,во избежания затмения у меня, повторяю задание

1)правило: если запрошен существующий файл на сервере то передавать его имя ,в качестве параметра переменной,на index.php
2)исключение: если запрашиваемый файл находится глубже корня - ничего не делать 

Автор: GZep 13.5.2007, 18:12
Цитата(Всемогущий @  13.5.2007,  11:15 Найти цитируемый пост)
Должен,только в корне.

Хорошо. Значит файл index.php он тоже должен перенаправлять. правильно? Или все-таки не должен ВСЕ обрабатывать?

Автор: Всемогущий 13.5.2007, 18:26
Цитата(GZep @  12.5.2007,  21:23 Найти цитируемый пост)
важное замечание: если так делать то надо снять обязательно редирект с файла index.php. Если не сделать, то будет происхоить следующее:запрос к файлу /news.phpвыполняется редирект к файлу index.php вот так:/index.php?file=news.phpНО редирект не останавливается и идет дальше(мы же теперь обращаемся к index.php):/index.php?file=index.php&file=news.phpи так далее:/index.php?file=index.php&file=index.php&file=news.phpпока сервер не зависнет...  Это надо учитывать и сделать игнор файлу index.php (делаем это при помощи RewriteCond %{REQUEST_FILENAME} !-f)


я это читал, предпологается что тот кто будет делать это учтёт.

Автор: GZep 13.5.2007, 18:32
Цитата(Всемогущий @  13.5.2007,  18:26 Найти цитируемый пост)
предпологается что тот кто будет делать это учтёт

в последней строчки цитаты я написАл про то как будет это делаться.

Добавлено через 5 минут и 20 секунд
чуть не забыл: для того, чтобы мой код работал надо чтобы небыло файлов в корне кроме index.php на которые моглибы быть обращения.

например если файла news.php в корне нет, то переделывается на index.php?file=news. Но если в корне есть файл news.php - редирект непроисходит.

Автор: Всемогущий 13.5.2007, 18:42
Цитата(GZep @  13.5.2007,  20:32 Найти цитируемый пост)
чуть не забыл: для того, чтобы мой код работал надо чтобы небыло файлов в корне кроме index.php на которые моглибы быть обращения.

их сотни

Автор: GZep 13.5.2007, 20:50
Цитата(Всемогущий @  13.5.2007,  18:42 Найти цитируемый пост)
их сотни

к ним непосредственно браузер обращается?

то есть, например, css или js файлы вообще не мешают.

главное, чтобы не было файлов типа news.php.

Автор: Всемогущий 13.5.2007, 21:11
какая разница css или js или  ещё что нибудь любые файлы кроме index.php

Автор: GZep 14.5.2007, 13:55
Всемогущий, я про разницу уже написАл. Пожалуйста, прочитай внимательней и вникни в проблему с этими файлами.

Автор: Всемогущий 14.5.2007, 15:19
я написал какая разница в том смысле что все файлы должны подподать под правило:если файл не находится в поддиректории,и не является index.php то должно происходить перенаправление на index.php ,а переменная {REQUEST_FILENAME} должна передаваться как

?file= {REQUEST_FILENAME}

Автор: xolod 14.5.2007, 15:43
Если вы помещаете файл не в корень, а поддиректорию, вам соответственно нужно изменять .htaccess.
Например я поместил архив и прошлого поста в директорию vingrad_htaccess и соотв. изменил .htaccess-файл.
Код

RewriteEngine On
Options +FollowSymLinks

RewriteBase /vingrad_htaccess
RewriteCond %{REQUEST_URI} ^\/vingrad_htaccess\/?[^/]+$
RewriteRule ^(.*) index.php?p=$1 [L,QSA]

Вам для другой директории тоже нужно будет изменить его, обяснять как, думаю не нужно :-). А лучше поставьте дома сервер, потестируйте у себя от корня, чтобы понять как оно работает.

Не дастся эта статья вам без драки, надо было сначала основательно изучить доку по mod_rewrite.

Автор: Всемогущий 14.5.2007, 16:26
Статья не про mod_rewrite.
До меня дошло:
если перефразировать правило:  находится глубже корня это значит имя содержит слеш.

:(

Автор: Всемогущий 14.5.2007, 16:45
как я понял идея не сбыточная

Автор: GZep 14.5.2007, 19:22
к сожалению такое бывает... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)