<-
Apache > HTTP Server > Documentation > Version 2.0

URL Переписывая Гида - Передовые темы

этот документ добавляется mod_rewrite reference documentation . это описывает, как можно использовать Апача mod_rewrite решить типичные проблемы НА ОСНОВЕ URL, с которыми webmasters являются commonony, которому противостоят. Мы даем детализированные описания о том, как решить каждую проблему, формируя URL, переписывая rulesets.

ВНИМАНИЕ: В зависимости от вашей конфигурации сервера может быть необходимо немного изменить примеры для вашей ситуации, например добавляя [PT] флаг, дополнительно используя mod_alias и mod_userdir , и т.д. Или переписывая ruleset, чтобы сойтись .htaccess контекст вместо в-сервер контекста. Всегда пробуйте понять то, что действительно делает специфический ruleset прежде, чем Вы используете это. Это избегает многих проблем.

см. также

top

Webcluster through Homogeneous URL Layout

описание:

мы хотим создать гомогенное и последовательное расположение URL по всем WWW-серверам на Интранете webcluster, то есть всех URL (в местный сервер определения и таким образом иждивенец сервера!) становившийся фактически сервер независимый ! То, что мы хотим, должно дать WWW namespace последовательное независимое от сервера расположение: никакому URL придется не включить никакой физически правильный целевой сервер. Сама группа должна вести нас автоматически физическому целевому хозяину.

решение:

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

user1 server_of_user1 user2 server_of_user2 : :

мы помещаем их в файлы map.xxx-to-host . секунда мы должны проинструктировать все серверы переадресовывать URL форм

/u/user/anypath /g/group/anypath /e/entity/anypath

к

http://physical-host/u/user/anypath http://physical-host/g/group/anypath http://physical-host/e/entity/anypath

когда URL не в местном масштабе действителен к серверу. Следующий ruleset делает это для нас помощью файлов карты (предполагающий, что server0 является сервером по умолчанию, который будет использоваться, если пользователь не будет иметь никакого входа в карте):

RewriteEngine on RewriteMap user-to-host txt:/path/to/map.user-to-host RewriteMap group-to-host txt:/path/to/map.group-to-host RewriteMap entity-to-host txt:/path/to/map.entity-to-host RewriteRule ^/u/

([^/]+)

/?(.*) http://

${user-to-host:$1|server0}

/u/$1/$2 RewriteRule ^/g/

([^/]+)

/?(.*) http://

${group-to-host:$1|server0}

/g/$1/$2 RewriteRule ^/e/

([^/]+)

/?(.*) http://

${entity-to-host:$1|server0}

/e/$1/$2 RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/ RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3\
top

Structured Homedirs

описание:

некоторые участки с тысячами пользователей обычно используют структурированное homedir расположение, то есть каждый homedir находится в подсправочнике, который начинается например с первого характера имени пользователя. Так, /~foo/anypath /home/ f /foo/.www/anypath в то время как /~bar/anypath /home/ b /bar/.www/anypath .

решение:

мы используем следующий ruleset, чтобы расширить URL тильды в точно вышеупомянутое расположение.

RewriteEngine on RewriteRule ^/~(

([a-z])

[a-z0-9]+)(.*) /home/

$2

/$1/.www$3
top

Filesystem Reorganization

описание:

это действительно - ужасный пример: заявление убийцы, которое тяжело использует в-справочник RewriteRules получить гладкий взгляд и чувство на Сети, в то время как ее структура данных никогда не затрогается или приспосабливается. Фон: net.sw является моим архивом свободно доступных пакетов программ Unix, которые я начал собирать в 1992. Это является и моим хобби и работой к к этому, потому что, в то время как я изучаю информатику, я также работал много лет как система и администратор сети в моем свободном времени. Каждую неделю я нуждаюсь в своего рода программном обеспечении, таким образом я создал глубокую иерархию справочников, где я хранил пакеты:

drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/ drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/ drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/ drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/ drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/ drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/ drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/ drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/ drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/ drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/ drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/ drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/ drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/ drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/ drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/ drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/

в июле 1996 я решил сделать эту публику архива к миру через хороший интерфейс Сети. "Хороший" означает, что я хотел предложить интерфейс, где Вы можете рассмотреть непосредственно через иерархию архива. И "хороший" означает, что я не сделал требуемый, чтобы изменить что - нибудь в этой иерархии - не даже, помещая некоторые подлинники CGI наверху этого. Почему? Поскольку вышеупомянутая структура должна быть позже доступный через ПРОГРАММУ ПЕРЕДАЧИ ФАЙЛОВ также, и я не хотел, чтобы никакая Сеть или материал CGI была там.

решение:

решение имеет две части: первое - ряд подлинников CGI, которые создают все страницы на всех директивных непрерывных уровнях. Я помещал их под /e/netsw/.www/ следующим образом:

-rw-r--r-- 1 netsw users 1318 Aug 1 18:10 .wwwacl drwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/ -rw-rw-rw- 1 netsw users 372982 Aug 5 16:35 LOGFILE -rw-r--r-- 1 netsw users 659 Aug 4 09:27 TODO -rw-r--r-- 1 netsw users 5697 Aug 1 18:01 netsw-about.html -rwxr-xr-x 1 netsw users 579 Aug 2 10:33 netsw-access.pl -rwxr-xr-x 1 netsw users 1532 Aug 1 17:35 netsw-changes.cgi -rwxr-xr-x 1 netsw users 2866 Aug 5 14:49 netsw-home.cgi drwxr-xr-x 2 netsw users 512 Jul 8 23:47 netsw-img/ -rwxr-xr-x 1 netsw users 24050 Aug 5 15:49 netsw-lsdir.cgi -rwxr-xr-x 1 netsw users 1589 Aug 3 18:43 netsw-search.cgi -rwxr-xr-x 1 netsw users 1885 Aug 1 17:41 netsw-tree.cgi -rw-r--r-- 1 netsw users 234 Jul 30 16:35 netsw-unlimit.lst

DATA/ подсправочник держит вышеупомянутую директивную структуру, то есть реальное net.sw материал и автоматически обновлен через rdist время от времени. Вторая часть проблемы остается: как соединять эти две структуры в одно гладко-выглядящее дерево URL? Мы хотим скрыться DATA/ справочник от пользователя, при управлении соответствующих подлинников CGI для различных URL. Вот - решение: сначала я помещал следующее во в-справочник файл конфигурации в DocumentRoot из сервера, чтобы переписать объявленный URL /net.sw/ к внутренней дорожке /e/netsw :

RewriteRule ^net.sw$ net.sw/ [R] RewriteRule ^net.sw/(.*)$ e/netsw/$1

первое правило - для запросов, которые пропускают тянущийся разрез! Второе правило делает реальную вещь. И затем прибывает конфигурация убийцы, которая остается во в-справочник config файле /e/netsw/.www/.wwwacl :

Options ExecCGI FollowSymLinks Includes MultiViews RewriteEngine on # we are reached via /net.sw/ prefix RewriteBase /net.sw/ # first we rewrite the root dir to # the handling cgi script RewriteRule ^$ netsw-home.cgi [L] RewriteRule ^index\.html$ netsw-home.cgi [L] # strip out the subdirs when # the browser requests us from perdir pages RewriteRule ^.+/(netsw-[^/]+/.+)$ $1 [L] # and now break the rewriting for local files RewriteRule ^netsw-home\.cgi.* - [L] RewriteRule ^netsw-changes\.cgi.* - [L] RewriteRule ^netsw-search\.cgi.* - [L] RewriteRule ^netsw-tree\.cgi$ - [L] RewriteRule ^netsw-about\.html$ - [L] RewriteRule ^netsw-img/.*$ - [L] # anything else is a subdir which gets handled # by another cgi script RewriteRule !^netsw-lsdir\.cgi.* - [C] RewriteRule (.*) netsw-lsdir.cgi/$1

некоторые намеки для интерпретации:

  1. заметить L (последний) флаг и никакая область замены (' - ') в дальше часть
  2. заметить ! (не) характер и C (цепь) флаг при первом правиле в последней части
  3. заметить всеобъемлющий образец в последнем правиле
top

Redirect Failing URLs To Other Webserver

описание:

типичные ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ о переписывании URL - как переадресовать запросы провала попытки на webserver к webserver B. Обычно это сделано через ErrorDocument CGI-подлинники в Perl, но есть также a mod_rewrite решение. Но уведомление, которое это выполняет более плохо чем использование ErrorDocument CGI-подлинник!

решение:

первое решение имеет лучшую работу, но меньше гибкости, и - меньше ошибочного сейфа:

RewriteEngine on RewriteCond /your/docroot/%{REQUEST_FILENAME}

!-f

RewriteRule ^(.+) http://

webserverB

.dom/$1

проблема здесь состоит в том, что это будет только работать для страниц в DocumentRoot . в то время как Вы можете добавить больше Условий (например, чтобы также обращаться с homedirs, и т.д.) есть лучший вариант:

RewriteEngine on RewriteCond %{REQUEST_URI}

!-U

RewriteRule ^(.+) http://

webserverB

.dom/$1

это использует особенность предвидения URL mod_rewrite . результат состоит в том, что это будет работать для всех типов URL и - безопасный путь. Но это делает воздействие работы на webserver, потому что для каждого запроса есть еще один внутренний подзапрос. Так, если ваши пробеги webserver на мощном центральном процессоре, используйте этот. Если это - медленная машина, используйте первый подход или лучше a ErrorDocument CGI-подлинник.

top

Мультиплексор Доступа Архива

описание:

сделать Вы знаете большой CPAN (Всесторонняя Сеть Архива Perl) под http://www.perl.com/CPAN ? Это делает переадресовывание к одному из нескольких серверов ПРОГРАММЫ ПЕРЕДАЧИ ФАЙЛОВ во всем мире, которые несут зеркало CPAN, и - приблизительно около местоположения клиента требования. Фактически это можно назвать обслуживанием мультиплексирования доступа ПРОГРАММЫ ПЕРЕДАЧИ ФАЙЛОВ. В то время как CPAN бежит через подлинники CGI, как может подобный подход, осуществленный через mod_rewrite ?

решение:

сначала мы замечаем это от версии 3.0.0 mod_rewrite может также использовать " ftp: "схема на переадресовывает. И секунда, приближение местоположения может быть сделано a RewriteMap по высокопоставленной области клиента. С прикованным ruleset хитрого мы можем использовать эту высокопоставленную область как ключ к нашей карте мультиплексирования.

RewriteEngine on RewriteMap multiplex txt:/path/to/map.cxan RewriteRule ^/CxAN/(.*) %{REMOTE_HOST}::$1 [C] RewriteRule ^.+\.

([a-zA-Z]+)

::(.*)$ ${multiplex:

$1

|ftp.default.dom}$2 [R,L]
## ## map.cxan -- Multiplexing Map for CxAN ## de ftp://ftp.cxan.de/CxAN/ uk ftp://ftp.cxan.uk/CxAN/ com ftp://ftp.cxan.com/CxAN/ : ##EOF##
top

Content Handling

Содержание Иждивенца Браузера

описание:

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

решение:

мы не можем использовать довольные переговоры, потому что браузеры не обеспечивают их тип в той форме. Вместо этого мы должны действовать на удар головой HTTP "Пользовательский агент". Следующий condig делает следующее: Если удар головой HTTP "Пользовательский агент" начинается с "Mozilla/3", страницы foo.html переписан к foo.NS.html и и остановки переписывания. Если браузер - "Рысь" или "Mozilla" версии 1 или 2, URL становится foo.20.html . все другие браузеры получают страницу foo.32.html . это сделано следующим ruleset:

RewriteCond %{HTTP_USER_AGENT} ^

Mozilla/3

.* RewriteRule ^foo\.html$ foo.

NS

.html [

L

] RewriteCond %{HTTP_USER_AGENT} ^

Lynx/

.* [OR] RewriteCond %{HTTP_USER_AGENT} ^

Mozilla/[12]

.* RewriteRule ^foo\.html$ foo.

20

.html [

L

] RewriteRule ^foo\.html$ foo.

32

.html [

L

]

Динамическое Зеркало

описание:

предположить, что есть хорошие webpages на отдаленных хозяевах, которых мы хотим принести в наш namespace. Для серверов ПРОГРАММЫ ПЕРЕДАЧИ ФАЙЛОВ мы использовали бы mirror программа, которая фактически поддерживает явную современную копию отдаленных данных относительно местной машины. Для webserver мы могли использовать программу webcopy который действует подобный через HTTP. Но оба метода имеют один главный недостаток: местная копия всегда столь же современна как часто, мы управляем программой. Было бы намного лучше, если зеркало не статический, мы должны установить явно. Вместо этого мы хотим динамическое зеркало с данными, которые обновлены автоматически, когда есть потребность (обновленные данные относительно отдаленного хозяина).

решение:

чтобы обеспечивать эту особенность, мы наносим на карту отдаленный webpage или даже полный отдаленный webarea к нашему namespace при помощи Пропускная способность По доверенности особенность (флаг [P] ):

RewriteEngine on RewriteBase /~quux/ RewriteRule ^

hotsheet/

(.*)$

http://www.tstimpreso.com/hotsheet/

$1 [

P

]
RewriteEngine on RewriteBase /~quux/ RewriteRule ^

usa-news\.html

$

http://www.quux-corp.com/news/index.html

[

P

]

Полностью изменить Динамическое Зеркало

описание:
...
решение:
RewriteEngine on RewriteCond /mirror/of/remotesite/$1 -U RewriteRule ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1

Восстановить Недостающие Данные от Интранета

описание:

это - хитрый путь действительного управления корпоративным (внешним) Интернетом webserver ( www.quux-corp.dom ), фактически держа и поддержание его данных относительно (внутреннего) Интранета webserver ( www2.quux-corp.dom ), который защищен брандмауэром. Уловка - то, что на внешнем webserver мы восстанавливаем требуемые данные, непрерывные от внутреннего.

решение:

сначала, мы должны удостовериться, что наш брандмауэр все еще защищает внутренний webserver и что только внешнему webserver позволяют восстановить данные от этого. Для фильтрующего пакет брандмауэра мы могли например формировать брандмауэр ruleset как следующее:


ALLOW

Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port

80


DENY

Host * Port * --> Host www2.quux-corp.dom Port

80

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

RewriteRule ^/~([^/]+)/?(.*) /home/$1/.www/$2 RewriteCond %{REQUEST_FILENAME}

!-f

RewriteCond %{REQUEST_FILENAME}

!-d

RewriteRule ^/home/([^/]+)/.www/?(.*) http://

www2

.quux-corp.dom/~$1/pub/$2 [

P

]

Балансирование Груза

описание:

предположим, что мы хотим загрузить баланс движение к www.foo.com www[0-5].foo.com (в общей сложности 6 серверов). Как это может быть сделано?

решение:

есть много возможных решений для этой проблемы. Мы обсудим сначала обычно известный DNS-базирующийся вариант и затем специальный с mod_rewrite :

  1. Коллективное письмо DNS

    самый простой метод для балансирования груза должен использовать особенность коллективного письма DNS BIND . здесь Вы только формируете www[0-9].foo.com как обычно в вашем DNS с (адрес) отчеты, например.

    www0 IN A 1.2.3.1 www1 IN A 1.2.3.2 www2 IN A 1.2.3.3 www3 IN A 1.2.3.4 www4 IN A 1.2.3.5 www5 IN A 1.2.3.6
    

    тогда Вы дополнительно добавляете следующий вход:

    www IN CNAME www0.foo.com. IN CNAME www1.foo.com. IN CNAME www2.foo.com. IN CNAME www3.foo.com. IN CNAME www4.foo.com. IN CNAME www5.foo.com. IN CNAME www6.foo.com.
    

    заметить, что это кажется неправильным, но - фактически намеченная особенность BIND и может использоваться таким образом. Однако, теперь когда www.foo.com решен, BIND выделяет www0-www6 - но в немного permutated/rotated заказывают каждый раз. Этим путем клиенты распространены по различным серверам. Но уведомление, что это не прекрасный груз, уравновешивающий схему, потому что DNS решают информацию, прячется про запас другим nameservers на сети, так однажды клиент, решило www.foo.com к детали wwwN.foo.com , все последующие запросы также идут в это специфическое название wwwN.foo.com . но заключительный результат в порядке, потому что полная сумма запросов действительно распространяется по различному webservers.

  2. Балансирование груза DNS

    сложный DNS-базирующийся метод для балансирования груза должен использовать программу lbnamed который может быть найден в http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html . это - Perl 5 программ в соединении с auxilliary инструментами, которое обеспечивает реальное балансирование груза для DNS.

  3. Коллективное письмо Пропускной способности По доверенности

    в этом варианте мы используем mod_rewrite и его особенность пропускной способности по доверенности. Сначала мы посвящаем www0.foo.com быть фактически www.foo.com при использовании единственного

    www IN CNAME www0.foo.com.
    

    вход в DNS. Тогда мы преобразовываем www0.foo.com к серверу только для полномочия, то есть мы формируем эту машину, таким образом все прибывающие URL только выдвинуты через внутреннее полномочие к одному из 5 других серверов ( www1-www5 ). Чтобы достигать этого, мы сначала устанавливаем ruleset, который связывается с грузом, уравновешивающим подлинник lb.pl для всех URL.

    RewriteEngine on RewriteMap lb prg:/path/to/lb.pl RewriteRule ^/(.+)$ ${lb:$1} [P,L]
    

    тогда мы пишем lb.pl :

    #!/path/to/perl ## ## lb.pl -- load balancing script ## $| = 1; $name = "www"; # the hostname base $first = 1; # the first server (not 0 here, because 0 is myself) $last = 5; # the last server in the round-robin $domain = "foo.dom"; # the domainname $cnt = 0; while (<STDIN>) { $cnt = (($cnt+1) % ($last+1-$first)); $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain); print "http://$server/$_"; } ##EOF##
    
    последнее уведомление: Почему это полезно? Походит www0.foo.com все еще перегружается? Ответ да, это перегружено, но с простыми запросами пропускной способности по доверенности, только! Вся ПЕРВАЯ СТЕПЕНЬ ИНТЕГРАЦИИ, CGI, ePerl, и т.д. обработка полностью сделана на других машинах. Это - существенный пункт.
  4. Коллективное письмо Hardware/TCP

    есть доступное решение для аппаратных средств, также. Cisco имеет животное по имени LocalDirector, который делает груз, балансирующий на уровне TCP/IP. Фактически это - своего рода ворота уровня кругооборота перед webcluster. Если Вы имеете достаточно денег и действительно нуждаетесь в решении с высокой эффективностью, используете этот.

новый ТИП ПАНТОМИМЫ, Новое Обслуживание

описание:

на сети есть много изящных программ CGI. Но их использование обычно скучно, таким образом много webmaster не использует их. Даже особенность тренера Действия Апача ТИПОВ ПАНТОМИМЫ является только соответствующей, когда программы CGI не нуждаются в специальных URL (фактически PATH_INFO и QUERY_STRINGS ) как их вход. Сначала, позвольте нам формировать новый тип файла с расширением .scgi (для безопасного CGI), который будет обработан популярным cgiwrap программа. Проблема здесь состоит в том, что например мы используем Гомогенное Расположение URL (см. выше), файл в пользовательском homedirs имеет URL /u/user/foo/bar.scgi . но cgiwrap нуждается в URL в форме /~user/foo/bar.scgi/ . следующее правило решает проблему:

RewriteRule ^/[uge]/

([^/]+)

/\.www/(.+)\.scgi(.*) ... ... /internal/cgi/user/cgiwrap/~

$1

/$2.scgi$3 [NS,

T=application/x-http-cgi

]

или предположите, что мы имеем еще некоторые изящные программы: wwwlog (который показывает access.log для поддерева URL и wwwidx (который управляет Проблеском на поддереве URL). Мы должны обеспечить область URL к этим программам, таким образом они знают, на какой области они должны действовать на. Но обычно это уродливый, потому что они - все времена, все еще которые требуют от этого области, то есть типично мы бежали бы swwidx программа изнутри /u/user/foo/ через гиперссылку к

/internal/cgi/user/swwidx?i=/u/user/foo/

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

решение:

решение здесь состоит в том, чтобы обеспечить специальный новый формат URL, который автоматически приводит к надлежащей просьбе CGI. Мы формируем следующее:

RewriteRule ^/([uge])/([^/]+)(/?.*)/\* /internal/cgi/user/wwwidx?i=/$1/$2$3/ RewriteRule ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3

теперь гиперссылка, чтобы искать в /u/user/foo/ читает только

HREF="*"

который внутренне автоматически преобразован к

/internal/cgi/user/wwwidx?i=/u/user/foo/

тот же самый подход приводит к просьбе для регистрации доступа программа CGI когда гиперссылка :log привыкает.

Непрерывная Довольная регенерация

описание:

здесь прибывает действительно тайная особенность: Динамически произведенные но страницы, которым статически служат, то есть страницы нужно поставить как чистые статические страницы (прочитанный от файловой системы, и только прошел), но они должны быть произведены динамически webserver, отсутствуя. Этим путем Вы могли CGI-произвести страницы, которым статически служат, если один (или cronjob) не удаляет статическое содержание. Тогда содержание освежено.

решение:
это сделано через следующий ruleset:
RewriteCond %{REQUEST_FILENAME}

!-s

RewriteRule ^page\.

html

$ page.

cgi

[T=application/x-httpd-cgi,L]

здесь запрос к page.html приводит к внутреннему пробегу передачи page.cgi если page.html все еще пропускает или имеет filesize пустой указатель. Уловка здесь - это page.cgi является обычным подлинником CGI который (дополнительно к STDOUT ) пишет его продукция файлу page.html . как только этим управляли, сервер отсылает данные page.html . когда webmaster хочет вызвать освежение содержания, он только удаляет page.html (обычно сделанный cronjob).

Документ С Автоосвежает

описание:

разве это не было бы хорошо, создавая комплекс webpage, если webbrowser автоматически освежит страницу каждый раз, мы пишем новую версию изнутри нашего редактора? Невозможный?

решение:

нет! Мы только комбинируем ПАНТОМИМУ многослойная особенность, webserver NPH особенность и власть манипуляции URL mod_rewrite . сначала, мы устанавливаем новую особенность URL: Добавление только :refresh к любым причинам URL это, чтобы быть освежен каждый раз это обновлено на файловой системе.

RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1

теперь, когда мы ссылаемся на URL

/u/foo/bar/page.html:refresh

это приводит к внутренней просьбе URL

/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html

единственная недостающая часть - подлинник NPH-CGI. Хотя можно было бы обычно говорить "оставленный как осуществление читателю" ;-), я обеспечу этому, также.

#!/sw/bin/perl ## ## nph-refresh -- NPH/CGI script for auto refreshing pages ## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved. ## $| = 1; # split the QUERY_STRING variable @pairs = split(/&/, $ENV{'QUERY_STRING'}); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/A-Z/a-z/; $name = 'QS_' . $name; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; eval "\$$name = \"$value\""; } $QS_s = 1 if ($QS_s eq ''); $QS_n = 3600 if ($QS_n eq ''); if ($QS_f eq '') { print "HTTP/1.0 200 OK\n"; print "Content-type: text/html\n\n"; print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n"; exit(0); } if (! -f $QS_f) { print "HTTP/1.0 200 OK\n"; print "Content-type: text/html\n\n"; print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n"; exit(0); } sub print_http_headers_multipart_begin { print "HTTP/1.0 200 OK\n"; $bound = "ThisRandomString12345"; print "Content-type: multipart/x-mixed-replace;boundary=$bound\n"; &print_http_headers_multipart_next; } sub print_http_headers_multipart_next { print "\n--$bound\n"; } sub print_http_headers_multipart_end { print "\n--$bound--\n"; } sub displayhtml { local($buffer) = @_; $len = length($buffer); print "Content-type: text/html\n"; print "Content-length: $len\n\n"; print $buffer; } sub readfile { local($file) = @_; local(*FP, $size, $buffer, $bytes); ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file); $size = sprintf("%d", $size); open(FP, "&lt;$file"); $bytes = sysread(FP, $buffer, $size); close(FP); return $buffer; } $buffer = &readfile($QS_f); &print_http_headers_multipart_begin; &displayhtml($buffer); sub mystat { local($file) = $_[0]; local($time); ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file); return $mtime; } $mtimeL = &mystat($QS_f); $mtime = $mtime; for ($n = 0; $n &lt; $QS_n; $n++) { while (1) { $mtime = &mystat($QS_f); if ($mtime ne $mtimeL) { $mtimeL = $mtime; sleep(2); $buffer = &readfile($QS_f); &print_http_headers_multipart_next; &displayhtml($buffer); sleep(5); $mtimeL = &mystat($QS_f); last; } sleep($QS_s); } } &print_http_headers_multipart_end; exit(0); ##EOF##

Массовое Действительное Оказание гостеприимства

описание:

<VirtualHost> особенность Apacheа хороша и большие работы, когда Вы только имеете несколько множеств действительных хозяев. Но когда Вы - ISP и имеете сотни действительных хозяев, чтобы обеспечить, эта особенность не лучший выбор.

решение:

чтобы обеспечивать эту особенность, мы наносим на карту отдаленный webpage или даже полный отдаленный webarea к нашему namespace при помощи Пропускная способность По доверенности особенность (флаг [P] ):

## ## vhost.map ## www.vhost1.dom:80 /path/to/docroot/vhost1 www.vhost2.dom:80 /path/to/docroot/vhost2 : www.vhostN.dom:80 /path/to/docroot/vhostN
## ## httpd.conf ## : # use the canonical hostname on redirects, etc. UseCanonicalName on : # add the virtual host in front of the CLF-format CustomLog /path/to/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b" : # enable the rewriting engine in the main server RewriteEngine on # define two maps: one for fixing the URL and one which defines # the available virtual hosts with their corresponding # DocumentRoot. RewriteMap lowercase int:tolower RewriteMap vhost txt:/path/to/vhost.map # Now do the actual virtual host mapping # via a huge and complicated single rule: # # 1. make sure we don't map for common locations RewriteCond %{REQUEST_URI} !^/commonurl1/.* RewriteCond %{REQUEST_URI} !^/commonurl2/.* : RewriteCond %{REQUEST_URI} !^/commonurlN/.* # # 2. make sure we have a Host header, because # currently our approach only supports # virtual hosting through this header RewriteCond %{HTTP_HOST} !^$ # # 3. lowercase the hostname RewriteCond ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$ # # 4. lookup this hostname in vhost.map and # remember it only when it is a path # (and not "NONE" from above) RewriteCond ${vhost:%1} ^(/.*)$ # # 5. finally we can map the URL to its docroot location # and remember the virtual host for logging puposes RewriteRule ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}] :
top

Access Restriction

Хозяин Отрицает

описание:

как мы можем запретить список внешне формируемых хозяев от использования нашего сервера?

решение:

для 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}/$1 RewriteRule !^NOT-FOUND/.* - [F] RewriteRule ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1 RewriteRule !^NOT-FOUND/.* - [F] RewriteRule ^NOT-FOUND/(.*)$ /$1
## ## hosts.deny ## ## ATTENTION! This is a map, not a list, even when we treat it as such. ## mod_rewrite parses it for key/value pairs, so at least a ## dummy value "-" must be present for each entry. ## 193.102.180.41 - bsdti1.sdm.de - 192.76.162.40 -

Полномочие Отрицает

описание:

как мы можем запретить определенному хозяину или даже пользователь специального хозяина от использования Apacheского полномочия?

решение:

мы сначала должны удостовериться mod_rewrite является ниже (!) mod_proxy в файле Конфигурации, собирая Apache webserver. Этим путем это называют прежде mod_proxy . тогда мы формируем следующее для хозяина-иждивенца, отрицают...

RewriteCond %{REMOTE_HOST}

^badhost\.mydomain\.com$

RewriteRule !^http://[^/.]\.mydomain.com.* - [F]

. .. и этот для user@host-dependent отрицают:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}

^badguy@badhost\.mydomain\.com$

RewriteRule !^http://[^/.]\.mydomain.com.* - [F]

Специальный Опознавательный Вариант

описание:

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

решение:

мы используем список, переписывают условия исключить все кроме наших друзей:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}

!^friend1@client1.quux-corp\.com$

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}

!^friend2

@client2.quux-corp\.com$ RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}

!^friend3

@client3.quux-corp\.com$ RewriteRule ^/~quux/only-for-friends/ - [F]

Referer-базирующийся Дефлектор

описание:

как может мы программировать гибкий Дефлектор URL, который действует на "Referer" HTTP удар головой и может формироваться с так многими обратившимися страницами, как мы любим?

решение:

использовать следующий действительно хитрый ruleset...

RewriteMap deflector txt:/path/to/deflector.map RewriteCond %{HTTP_REFERER} !="" RewriteCond ${deflector:%{HTTP_REFERER}} ^-$ RewriteRule ^.* %{HTTP_REFERER} [R,L] RewriteCond %{HTTP_REFERER} !="" RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]

. .. в соединении с передачей переписывают карту:

## ## deflector.map ## http://www.badguys.com/bad/index.html - http://www.badguys.com/bad/index2.html - http://www.badguys.com/bad/index3.html http://somewhere.com/

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