
Навигация |
Сайт
|
Каталог
|
Материалы сайта
|
|

|
|
FAQ: mod_rewrite
|
 |
|
18.02.2005
174440
Опубликовал: Serebro
|
Скачать mod rewrite для apache здесь [45Kb]<!-- .t {font-family: Verdana, Arial; font-size: 1.3em; font-weight: bold; padding-bottom: 5px;} .c {font-size: 1.1em} .n {font-family: Verdana, Arial; font-size: 0.8em; color: #000000; text-align: justify} .n2 {font-family: Verdana, Arial; font-size: 0.8em; text-align: justify} .b {font-family: Verdana, Arial; font-size: 0.8em; color: #000000; font-weight: bold} .s {font-family: Verdana, Arial; font-size: 0.7em} .g {font-family: Verdana, Arial; font-size: 0.7em; color: #606060} .g2 {font-family: Verdana, Arial; font-size: 0.85em; color: #606060} .z {color: black; background: #ffdfdf} .a.l:hover {color: #000000; text-decoration: underline} .l {text-decoration: none} --> FAQ: mod_rewrite 1. Kirill-B, 19.04.2004 13:25 | Brass Мне кажется самое простое и логичное в данном случае хранить все таблицы css в одном месте, в директории styles, созданной в корне сайта (по аналогии с images) и обращаться к этой таблице /styles/styles.css |
2. Brass, 19.04.2004 13:34 | Kirill-B То есть ты хочешь сказать единственный выход - абсолютные пути Но проблема в том что для моего хостинга абсолютные пути начинаются с нечто вроде /home/u135/vzxk.ru/www а локально же такого нет... Хочется сразу писать, тестить и переносить не правя пути... |
3. Kirill-B, 19.04.2004 13:59 | Brass То есть ты хочешь сказать единственный выход - абсолютные пути Я предложил вариант решения
Но проблема в том что для моего хостинга абсолютные пути начинаются с нечто вроде /home/u135/vzxk.ru/www а локально же такого нет... /styles/styles.css - путь, начиная с DOCUMENT_ROOT Например, у меня на одной из машин DOCUMENT_ROOT = /opt/local/apache/htdocs, я создаю директорию /opt/local/apache/htdocs/styles и в html обращаюсь к ней /styles/styles.css. На другой машине DOCUMENT_ROOT = /var/www, я создаю директорию /var/www/styles и, все равно, в html обращаюсь к ней /styles/styles.css |
5. Brass, 19.04.2004 14:32 | Kirill-B Ага, я разобрался сенкс. Это верно, не надо было /home/u135/vzxk.ru/www добавлять, это я попутал чё то...  |
6. Нейтрон, 19.04.2004 14:32 | Ой, чот я не так понял... Фигово дело, вообще... userlist у тебя теперь как бы директория и из путей её не убрать так легко...
код:
RewriteRule ^/(.*)userlist/(.*)$ /$1userlist.php?author=$2 [NC] RewriteRule ^/(.*)/userlist/css/(.*)$ /$1/css/$2 [NC] RewriteRule ^/(.*)/userlist/img/(.*)$ /$1/img/$2 [NC] ...
И так для всех нужных внутренних директорий... Иначе можно, если у тебя author какую нибудь характеристическую особенность имеет. Например, если authоr начинается с "auth"
код:
RewriteCond %{REQUEST_URI} ^/(.*)userlist/auth(.*)$ RewriteRule ^/(.*)userlist/(.*)$ /$1userlist.php?author=$2 [NC] RewriteRule ^/(.*)/userlist/(.*)$ /$1/$2 [L]
Добавление от 19.04.2004 14:36: В любом случае, лучше абсолютные пути к css файлам прописать и не нагружать mod_rewrite |
К этой теме 19.04.2004 14:45 moderator-24 подклеил тему "Помогите с Mod_Rewrite" (автор: Lonely Ranger) |
8. Lonely Ranger, 16.04.2004 14:44 | В общем дело вот в чем: мне надо при запросе определенных страниц (даже не страниц а урл) запускать скрипт RewriteRule ^(auth|search|reg)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+) /cgi-bin/$1.pl?$2&$3&$4&$5&$6&$7&$8&$9 [T=application/x-httpd-cgi,L] Но он хочет запустить скрипт из директории WWW, а не CGI-BIN. Приходится дописывать так RewriteRule ^(auth|search|reg)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+) /cgi-bin/$1.pl?$2&$3&$4&$5&$6&$7&$8&$9 [T=application/x-httpd-cgi,L,C] Options +ExecCGI
и помещать скрипт в директорию WWW. Как добиться нормально запуска скрипта из своей директории? |
9. Kirill-B, 16.04.2004 14:56 | Lonely Ranger Самый действенный способ в таких случаях включить уровень логов 9 и больше и смотреть в них. Там подробно пишется, что получил, как понял и тд. RewriteLogLevel n |
14. Kirill-B, 19.04.2004 18:27 | Lonely Ranger Похоже /reg/step=2/ не матчится с ^/(auth|search|reg)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+). Там вооооооон сколько слэшей должно быть Говорю же, RewriteLogLevel 9+ и консультируйтесь с логами, они там очень понятные |
15. Lonely Ranger, 19.04.2004 19:03 | Kirill-B Тогда помоги разобраться с логами, я что-то не врублюсь:
127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] add path-info postfix: w:/home/localhost/www/reg.pl -> w:/home/localhost/www/reg.pl/step=2/ 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] strip per-dir prefix: w:/home/localhost/www/reg.pl/step=2/ -> reg.pl/step=2/ 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] applying pattern '^(sid[^/]+)/(.+)$' to uri 'reg.pl/step=2/' 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] add path-info postfix: w:/home/localhost/www/reg.pl -> w:/home/localhost/www/reg.pl/step=2/ 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] strip per-dir prefix: w:/home/localhost/www/reg.pl/step=2/ -> reg.pl/step=2/ 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] applying pattern '^/(auth|search|reg)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)' to uri 'reg.pl/step=2/' 127.0.0.1 - - [19/Apr/2004:19:10:21 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (1) [per-dir w:/home/localhost/www/] pass through w:/home/localhost/www/reg.pl
Кстати, а не всё ли равно сколько слэшей? Я просто хотел чтобы я мог с разных вариациях вызывать этот скрипт. Теперь получается, что я должен что-то конкретное задавать? Если нет ничего - то пусто "//" - так? |
16. Kirill-B, 20.04.2004 09:39 | Lonely Ranger Подождь, это какой-то не тот лог. Нужен типа такого: RewriteLogLevel 9 RewriteLog "/usr/local/var/apache/logs/rewrite.log" |
17. Lonely Ranger, 20.04.2004 10:30 | Вот с 9 уровнем
127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] add path-info postfix: w:/home/localhost/www/reg.pl -> w:/home/localhost/www/reg.pl/step=2/ 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] strip per-dir prefix: w:/home/localhost/www/reg.pl/step=2/ -> reg.pl/step=2/ 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] applying pattern '^(sid[^/]+)/(.+)$' to uri 'reg.pl/step=2/' 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] add path-info postfix: w:/home/localhost/www/reg.pl -> w:/home/localhost/www/reg.pl/step=2/ 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] strip per-dir prefix: w:/home/localhost/www/reg.pl/step=2/ -> reg.pl/step=2/ 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (3) [per-dir w:/home/localhost/www/] applying pattern '^/(auth|search|reg)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)' to uri 'reg.pl/step=2/' 127.0.0.1 - - [20/Apr/2004:11:26:13 +0400] [localhost/sid#9770d8][rid#a4d4f0/initial] (1) [per-dir w:/home/localhost/www/] pass through w:/home/localhost/www/reg.pl
Но кажется, что он не отличается от того, что я давал раньше. (я заменил домен на localhost). Всё это работает на локальной машине. Апач собран от Денвера. Может быть тут в чем дело? |
20. Joshua5, 20.04.2004 11:30 | это логи 2-го апача, если я ничего не путаю  странно только что нет строчек 'matched' или 'not matched' после 'applying pattern' - нельзя понять, подошёл ему шаблон или нет |
К этой теме 20.04.2004 11:49 moderator-24 подклеил тему "Как грамотно использовать .htaccess?" (автор: terex) |
23. terex, 19.04.2004 18:30 | Сайт имеет древовидную структуру, причём каждая ветка дерева физически отображается папкой файловой системы. В каждой папке есть /index.php, который должен исполняться в результате запросов вида http://site.my/one/two/page_id.html, причём ему должен быть передан параметр page_id. При этом все остальные запросы должны вызывать стандартный обработчик error 404 (устанавливается посредством .htaccess в корне сайта).
Сейчас делаю так. В каждую папку кладу свой .htaccess и пишу в нём следующее:
код:
RewriteEngine On RewriteBase /one/two/ RewriteRule ^(\d+).html$ /index.php/id/$1
И всё работает Понимаю, что от добра добра не ищут, но тем не менее. Думается, можно аналогичную логику реализовать одним единственным .htaccess, расположенным в корне сайта. Однако как именно - догадаться не могу.
Поможете? |
26. Хитачик, 19.04.2004 19:11 | Насколько я знаю RegExp'ы, я бы написал что-то типа такого:код:
RewriteRule ^(.+)/(\d+).html$ $1/index.php?id=$2
Но я никогда не работал с mod_rewrite, а посему не уверен, правильно ли это. |
27. Нейтрон, 19.04.2004 20:55 | Что-то всех на mod_rewrite потянуло...
код:
RewriteRule ^/(.+)/(\d+).html$ /$1/index.php?id=$2
Всё. Больше ничего не нужно. |
30. Ortick, 20.04.2004 07:01 | Action throw /index.php
ForceType throw
ForceType application/x-httpd-php
Такой вариант более предпочтителен, т.к. нагрузки меньше и POST запросы пропускает. В данном случае все запросы из браузера без расширения (http://site.my/one/two/page_id) будут отдаваться /index.php, расположенного в корне, а там уже обрабатывать запрос. Единственное, PHP должен быть установлен как модуль апача. Ну и ест-но можно сделать и так что все файлы с расш. html также будут отдаваться на съедение index.php... |
32. Kirill-B, 20.04.2004 12:15 | Lonely Ranger Короче, ради такого дела, компильнул апач+мод_рерайт Как я и предполагал, дело оказалось в неверном паттерне. Могу предложить свой вариант безо всяких извращений: RewriteRule ^(auth|search|reg)/(.*)$ /cgi-bin/$1.pl?$2 [T=application/x-httpd-cgi,L] |
33. Joshua5, 20.04.2004 12:16 | Lonely Ranger
если в правиле указано, например 3 слеша ^(reg)/([^/]+)/([^/]+)/([^/]+)/ то я и 3 должен прямо указать в перезаписи /cgi-bin/$1.pl?p1=$2&p2=$3&p3=$4
не обязательно можешь использовать столько переменных, сколько хочешь - одну или все
Кстати написать именно так и не /cgi-bin/$1.pl?$2&$3&$4
ну, если ты сам парсишь QUERY_STRING, то пофиг
почему он хочет запустить скрипт из www, а не из cgi-bin
а ты Alias прописал? |
36. Lonely Ranger, 20.04.2004 15:37 | Kirill-B Прикол - не передаётся-то QUERY_SRTING, а вот REQUEST_URI есть
COMSPEC=C:\WINDOWS\system32\cmd.exe DOCUMENT_ROOT=w:/home/mpg3/www GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=*/* HTTP_ACCEPT_ENCODING=gzip, deflate HTTP_ACCEPT_LANGUAGE=ru HTTP_CACHE_CONTROL=no-cache HTTP_CONNECTION=Keep-Alive HTTP_HOST=mpg3 HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) PATH=\usr\local\apache\..\php; \usr\local\apache\..\php\extensions; \usr\local\apache\..\php\dlls; C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem; w:\usr\bin PATH_INFO=/step=2/ PATH_TRANSLATED=w:\home\mpg3\www\step=2\ QUERY_STRING= REMOTE_ADDR=127.0.0.1 REMOTE_PORT=1040 REQUEST_METHOD=GET REQUEST_URI=/reg/step=2/ SCRIPT_FILENAME=w:/home/mpg3/www/reg.pl SCRIPT_NAME=/reg SERVER_ADDR=127.0.0.1 SERVER_ADMIN=webmaster@localhost SERVER_NAME=mpg3 SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.1 SERVER_SIGNATURE= Apache/1.3.27 Server at mpg3 Port 80 SERVER_SOFTWARE=Apache/1.3.27 (Win32) PHP/4.3.0 SYSTEMROOT=C:\WINDOWS WINDIR=C:\WINDOWS |
38. Kirill-B, 20.04.2004 15:48 | Lonely Ranger У меня все ОК
цитата:
mos150: /opt > telnet mos150 8080 Trying 158.140.175.150... Connected to mos150. Escape character is '^]'. GET /reg/step=1/step=2 DOCUMENT_ROOT="/opt/httpd/htdocs" GATEWAY_INTERFACE="CGI/1.1" QUERY_STRING="step=1/step=2" REDIRECT_QUERY_STRING="step=1/step=2" REDIRECT_STATUS="200" REDIRECT_URL="/reg/step=1/step=2" REMOTE_ADDR="158.140.175.150" REMOTE_PORT="40541" REQUEST_METHOD="GET" REQUEST_URI="/reg/step=1/step=2" SCRIPT_FILENAME="/opt/httpd/cgi-bin/printenv.pl" SCRIPT_NAME="/cgi-bin/printenv.pl" SERVER_ADDR="158.140.175.150" SERVER_ADMIN="kirill@cadence.com" SERVER_NAME="local.server" SERVER_PORT="8080" SERVER_PROTOCOL="HTTP/0.9" SERVER_SIGNATURE="Apache/1.3.29 Server at local.server Port 8080\n" SERVER_SOFTWARE="Apache/1.3.29 (Unix) mod_perl/1.29" Connection closed by foreign host.
|
39. Lonely Ranger, 20.04.2004 15:50 | Нейтрон А мне так этого не хотелось делать Видать придётся  Вот если бы еще из cgi-bin всё это запустить. Добавление от 20.04.2004 15:53: Kirill-B ну может быть всётаки дело в том наборе, который я юзаю. На нормальном серваке (под линуксой) наверное нормально и работало бы. Надо бы проверить. Хотелось сначала дома всё сделать, а потом просто перетащить на сервак (не очень удобно в мс работать, ну не так как в фаре, например). |
42. Kirill-B, 21.04.2004 09:53 | Lonely Ranger cgi-bin нормально работает, если напрямую написать в строке браузера http://localhost/cgi-bin/reg.pl он отрабатывает (это точно такой же скрипт, что находится и в www), а вот через mod_rewrite не хочет браться из cgi-bin А рул в конфиге точно такой? (может забыл чего) RewriteRule ^(auth|search|reg)/(.*)$ /cgi-bin/$1.pl?$2 [T=application/x-httpd-cgi,L] |
45. Lonely Ranger, 21.04.2004 11:46 | Kirill-B Вот он какой RewriteRule ^(auth|search|reg)/([^/]+)/$ /cgi-bin/$1.pl?$2 [QSA,T=application/x-httpd-cgi,L,R,C] Options +ExecCGI Но запускаться оттуда не хочет. Хочет из ВВВ |
46. Нейтрон, 21.04.2004 12:07 | Lonely Ranger Так я не понял, у тебя один файл reg.pl или два? И где он(и) физически лежит(ат)? И как задан путь к cgi-bin в httpd.conf? Добавление от 21.04.2004 12:11: /home/site/cgi-bin /home/site/www
DocumentRoot /home/site/www ScriptAlias /cgi-bin/ "/home/site/cgi-bin/"
У тебя так? |
47. Kirill-B, 21.04.2004 12:11 | Lonely Ranger R,C убертие, оно Вам не надо QSA в данном случае тоже можно убрать
(строка, которую я Вам показал у меня отлично работает) |
48. Нейтрон, 21.04.2004 12:23 | Lonely Ranger Если честно, я вообще не понимаю необходимость во всех этих флагах. У меня прекрасно работает (через .htaccess) такое:
код:
RewriteEngine on RewriteBase /hp/fanfiction/ RewriteRule ^review/([0-9]+)/revs$ /cgi-bin/review.cgi?action=review&article=$1 [L] RewriteRule ^review/([0-9]+)/$ /cgi-bin/review.cgi?action=read&article=$1 [L]
|
49. Lonely Ranger, 21.04.2004 12:32 | Нейтрон вот настройки для хоста
код:
DocumentRoot "W:/home/mpg3/www" ServerName "www.mpg3" ServerAlias "mpg3" "www.mpg3" ScriptAlias /cgi/ "/home/mpg3/cgi/" ScriptAlias /cgi-bin/ "/home/mpg3/cgi-bin/" ErrorLog "/home/mpg3/error.log"
Я просто скопировал копию скрипта из cgi-bin в www. Вот и всё. Я же говорю, что из cgi-bin не хочет брать и работать.
Скорее всего это всё из-за того что под виндой и сервер от Денвера. Сегодня-завтра попробую на нормальном под линуксом. |
К этой теме 11.07.2004 14:48 moderator-bn подклеил тему "mod_rewrite apach'a и проблемы с ним" (автор: DiS) |
Тема перенесена 11.07.2004 14:16 QZ из форума "Программирование" |
53. Нейтрон, 11.07.2004 14:54 | DiS Ну, мы разобрались более-менее. Чем помочь то?
код:
RewriteEngine on RewriteBase /content/ RewriteRule ^([a-z]+)/([a-z]+)/([0-9]+) /script.php?cat=$1&view=$2&off=$3 [L]
|
56. DiS, 12.07.2004 16:21 | Простите за глупый вопрос (наверное ), но почему у меня нифига не работает и вообще, такое ощущение, что .htaccess не обрабатывается 
З.Ы. Надо ли чтонить менять в httpd.conf для того, чтобы mod_rewrite работал? Ну, кроме раскомментивания соотв. строк  |
59. DiS, 12.07.2004 20:30 | Нейтрон Все равно не пашет фигня какая-то... Даже на 404 не откликается (ErrorDocument 404 /path/error.html) |
61. DiS, 12.07.2004 22:09 | Ладно, с этой феней я выкрутился. Теперь другая проблема: полное отсутствие на паге скриптов и картинок На www.sitemaker.ru было описано, как с этим бороться, но что-то больно геморройно , да и работает криво.
Вот что у меня получилось:
код:
RewriteEngine on RewriteRule ^docs/(.*)/(.*)$ /index.php/cat/$1/view/$2
Я что-то слышал про RewriteCond или как-то так... Вроде можно через это.
Вариант через
код:
не рассматривается - я офигею каждый раз перед закачкой на хостинг менять урлу (я раз по пять закачиваю скрипт - дебаггинг однако ) Добавление от 12.07.2004 22:10: Нейтрон Да, штука была, почему не работало - до сих пор не понял  Добавление от 12.07.2004 22:11: З.Ы. Трюк с вообще не рулит! Он со скриптами нифига не помогает Как не работали, так работать и не стали... |
62. Нейтрон, 14.07.2004 15:43 | DiS Я что-то слышал про RewriteCond или как-то так... Вроде можно через это. Если я правильно понял, то это: RewriteCond %{REQUEST_URI} !^/(.+)\.(gif|jpg)$ |
63. DiS, 14.07.2004 17:31 | Нейтрон Не сработало... У меня на сайте все лежит примерно вот так: JS - в корне, GIF - в папке /images, JPEG,ZIP и еще много всякого в других папках. txt документы только в content, а потому может написать условие, чтобы обрабатывались только тхт из контента (если это возможно, конечно )? |
64. Нейтрон, 14.07.2004 17:50 | DiS Условие нужно по запросу задавать, а не по результату.
Например так:
код:
RewriteEngine on RewriteRule ^/docs/(.+)/(.+)/$ /?cat=$1&view=$2
При этом желательно, чтобы директории docs не было вообще. |
К этой теме 27.09.2004 11:32 moderator-24 подклеил тему "Настройка Apache mod_rewrite под WIN - Ошибка." (автор: Bobbybest) |
66. Bobbybest, 26.09.2004 23:15 | Господа!
на локальной машине создан файл .htaccess -------------------- RewriteEngine On Options +FollowSymlinks RewriteBase / RewriteRule ^catalog/(.*)$ /catalog.php
-------------------- При вызове алиас/catalog/1 выскакивает 500 ошибка. В логах: Premature end of script headers: c:/php/php.exe
Сам скрипт алиас/catalog.php - работает.
Исходник скрипта: header ("Last-Modified: ".gmstrftime ("%a, %d %b %Y %T GMT", time())); Header("HTTP/1.0 200 OK"); Header("Content-type: text/html"); echo("1"); ?>
-------------------- Об php в httpd.conf
AddType application/x-httpd-php .php ScriptAlias /_php/ "C:/PHP/" Action application/x-httpd-php "/_php/php.exe" AddType application/x-httpd-php-source .phps --------------------
В чем может быть косяк? у хостера работает. подозреваю, что что с настройками PHP в httpd.conf |
Тема перенесена 27.09.2004 02:35 moderator-mik из форума "Программы: *nix-like системы" |
К этой теме 09.11.2004 17:50 moderator-24 подклеил тему "Как прикрутить mod_rewrite к Апачу под FreeBSD?" (автор: volk1905) |
|
|
|
|
|
 |