<-
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

Canonical URLs

описание:

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

решение:

мы делаем внешний HTTP переадресовывает для всех неканонических URL, чтобы установить их в представлении местоположения Браузера и для всех последующих запросов. В примере ruleset ниже мы заменяем /~user каноническим /u/user и установите отсутствие, тащащее разрез для /u/user .

RewriteRule ^/

~

([^/]+)/?(.*) /

u

/$1/$2 [

R

] RewriteRule ^/([uge])/(

[^/]+

)$ /$1/$2

/

[

R

]
top

Canonical Hostnames

описание:
цель этого правила состоит в том, чтобы вызвать использование специфического hostname, в предпочтении к другому hostnames, который может использоваться, чтобы достигнуть того же самого участка. Например, если Вы желаете вызвать использование www.example.com вместо example.com , Вы могли бы использовать вариант следующего рецепта.
решение:

для участков, бегущих на порту кроме 80:

RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC] RewriteCond %{HTTP_HOST} !^$ RewriteCond %{SERVER_PORT} !^80$ RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]

и для участка, бегущего на порту 80

RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]
top

Moved DocumentRoot

описание:

обычно DocumentRoot из webserver непосредственно имеет отношение с URL " / ". Но часто эти данные не действительно высокопоставленного приоритета. Например, Вы можете желать посетителей, на первом входе в участок, пойти в специфический подсправочник /about/ . это может быть достигнуто, используя следующий ruleset:

решение:

мы переадресовываем URL / к /about/ :

RewriteEngine on RewriteRule

^/$

/about/ [

R

]

отметить, что это может также быть обработано, используя RedirectMatch директива:

RedirectMatch ^/$ http://example.com/e/www/

top

Trailing Slash Problem

описание:

с огромным большинством "перемещения разреза" проблемы можно иметь дело с использованием методов, обсужденных в FAQ entry . однако, иногда, есть потребность использовать mod_rewrite, чтобы обращаться со случаем, где отсутствие, тащащее разрез заставляет URL терпеть неудачу. Это может случиться, например, после того, как ряд комплекса переписывает правила.

решение:

решение этой тонкой проблемы состоит в том, чтобы позволить серверу добавлять тянущийся разрез автоматически. Чтобы сделать это правильно, мы должны использовать внешнее, переадресовывают, таким образом браузер правильно просит последующие изображения и т.д. Если бы мы только сделали внутреннее переписывает, это только работало бы для директивной страницы, но пошло бы не так, как надо, когда любые изображения включены в эту страницу с относительными URL, потому что браузер просил бы в - выровненный объект. Например, запрос о 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]
top

Move Homedirs to Different Webserver

описание:

много webmasters спросили решение следующей ситуации: Они хотели переадресовать только весь homedirs на webserver к другому webserver. Они обычно нуждаются в таких вещах, устанавливая более новый webserver, который заменит старый в течение долгого времени.

решение:

решение тривиально с mod_rewrite . на старом webserver мы только переадресовываем все /~user/anypath URL к http://newserver/~user/anypath .

RewriteEngine on RewriteRule ^/~(.+) http://

newserver

/~$1 [R,L]
top

Search pages in more than one directory

описание:

иногда необходимо позволить поиску webserver страниц в больше чем одном справочнике. Здесь Мультирассматривает, или другие методы не могут помочь.

решение:

мы программируем явный ruleset, который ищет файлы в справочниках.

RewriteEngine on # first try to find it in custom/... # ...and if found stop and be happy: RewriteCond /your/docroot/

dir1

/%{REQUEST_FILENAME} -f RewriteRule ^(.+) /your/docroot/

dir1

/$1 [L] # second try to find it in pub/... # ...and if found stop and be happy: RewriteCond /your/docroot/

dir2

/%{REQUEST_FILENAME} -f RewriteRule ^(.+) /your/docroot/

dir2

/$1 [L] # else go on for other Alias or ScriptAlias directives, # etc. RewriteRule ^(.+) - [PT]
top

Set Environment Variables According To URL Parts

описание:

возможно Вы хотите держать информацию статуса между запросами и использовать URL, чтобы закодировать это. Но Вы не хотите использовать обертку CGI для всех страниц только, чтобы раздеть эту информацию.

решение:

мы используем переписывающееся правило раздеть информацию статуса и помнить это через переменную окружающей среды, которая может быть более поздним dereferenced изнутри XSSI или CGI. Этим путем URL /foo/S=java/bar/ переведен к /foo/bar/ и названная переменная окружающей среды STATUS собирается ценность "Ява".

RewriteEngine on RewriteRule ^(.*)/

S=([^/]+)

/(.*) $1/$3 [E=

STATUS:$2

]
top

Virtual User Hosts

описание:

предположить, что Вы хотите обеспечить www. username .host.domain.com для начальной страницы имени пользователя через справедливый DNS отчеты на ту же самую машину и без любого virtualhosts на этой машине.

решение:

для запросов HTTP/1.0 нет никакого решения, но для запросов HTTP/1.1, которые содержат Хозяина: удар головой HTTP мы можем использовать следующий ruleset, чтобы переписать http://www.username.host.com/anypath внутренне к /home/username/anypath :

RewriteEngine on RewriteCond %{

HTTP_HOST

} ^www\.

[^.]+

\.host\.com$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^www\.

([^.]+)

\.host\.com(.*) /home/

$1

$2
top

Redirect Homedirs For Foreigners

описание:

мы хотим переадресовать homedir URL к другому webserver www.somewhere.com когда пользователь требования не остается в местной области ourdomain.com . это иногда используется в действительных контекстах хозяина.

решение:

только переписывающееся условие:

RewriteEngine on RewriteCond %{REMOTE_HOST}

!^.+\.ourdomain\.com$

RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]
top

Redirecting Anchors

описание:

по умолчанию, переадресовывание на якорь HTML не работает, потому что mod_rewrite убегает # характер, поворачивая это в %23 . это, в свою очередь, нарушает переназначение.

решение:

использование [NE] флаг на RewriteRule . НЕОН не поддерживает Никакого Спасения.

top

Зависимое временем Переписывание

описание:

когда уловки как зависимое временем содержание должны случиться, что много webmasters все еще использует подлинники CGI, которые делают например переадресовывает к специализированным страницам. Как может это быть сделанным через mod_rewrite ?

решение:

есть много названных переменных TIME_xxx для переписывают условия. В соединении со специальными лексикографическими образцами сравнения <STRING , >STRING и =STRING мы можем сделать иждивенец времени переадресовывает:

RewriteEngine on RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700 RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900 RewriteRule ^foo\.html$ foo.day.html RewriteRule ^foo\.html$ foo.night.html

это обеспечивает содержание foo.day.html под URL foo.html от 07:00-19:00 и в остающееся время содержание foo.night.html . только хорошая особенность начальной страницы...

top

Обратная Совместимость для YYYY к XXXX перемещениям

описание:

как может мы делать URL назад совместимыми (все еще существующий фактически) после перемещения document.YYYY к document.XXXX , например после перевода связки .html файлы к .phtml ?

решение:

мы только переписываем название к его basename и тесту на существование нового расширения. Если это существует, мы берем то название, еще мы переписываем URL к его оригинальному государству.

# backward compatibility ruleset for # rewriting document.html to document.phtml # when and only when document.phtml exists # but no longer document.html RewriteEngine on RewriteBase /~quux/ # parse out basename, but remember the fact RewriteRule ^(.*)\.html$ $1 [C,E=WasHTML:yes] # rewrite to document.phtml if exists RewriteCond %{REQUEST_FILENAME}.phtml -f RewriteRule ^(.*)$ $1.phtml [S=1] # else reverse the previous basename cutout RewriteCond %{ENV:WasHTML} ^yes$ RewriteRule ^(.*)$ $1.html
top

Content Handling

От Старого до Нового (молодой специалист)

описание:

предположить, что мы недавно переименовали страницу foo.html к bar.html и теперь хотите обеспечить старый URL для обратной совместимости. Фактически мы хотим это, пользователи старого URL даже не признают, что страницы были переименованы.

решение:

мы переписываем старый URL к новому внутренне через следующее правило:

RewriteEngine on RewriteBase /~quux/ RewriteRule ^

foo

\.html$

bar

.html

От Старого до Нового (экскрачка)

описание:

предположить снова, что мы недавно переименовали страницу foo.html к bar.html и теперь хотите обеспечить старый URL для обратной совместимости. Но на сей раз мы хотим это, пользователям старого URL намекают новому, то есть их область Location браузеров должна измениться, также.

решение:

мы вызываем HTTP, переадресовывают к новому URL, который приводит к изменению браузеров и таким образом представление пользователей:

RewriteEngine on RewriteBase /~quux/ RewriteRule ^

foo

\.html$

bar

.html [

R

]

От Статического до Динамического

описание:

как может мы преобразовывать статическую страницу foo.html в динамический вариант foo.cgi способом без шва, то есть без уведомления браузером/пользователем.

решение:

мы только переписываем URL к CGI-подлиннику и вызываем правильный ТИП ПАНТОМИМЫ, таким образом этим действительно управляют как CGI-подлинник. Этим путем запрос к /~quux/foo.html внутренне приводит к просьбе /~quux/foo.cgi .

RewriteEngine on RewriteBase /~quux/ RewriteRule ^foo\.

html

$ foo.

cgi

[T=

application/x-httpd-cgi

]
top

Access Restriction

блокирование Роботов

описание:

как мы можем блокировать действительно раздражающий робот от восстановления страниц определенного webarea? A /robots.txt файл, содержащий записи "Протокола Исключения Робота" типично недостаточно, чтобы избавиться от такого робота.

решение:

мы используем ruleset, который запрещает URL webarea /~quux/foo/arc/ (возможно очень глубокий справочник вносил область в указатель, где пересечение робота создаст большой груз сервера). Мы должны удостовериться, что мы запрещаем доступ только к специфическому роботу, то есть только запрещению хозяина, куда робот бежит - недостаточно. Это блокировало бы пользователей от этого хозяина, также. Мы достигаем этого, также соответствуя Пользовательскому агенту информация удара головой HTTP.

RewriteCond %{HTTP_USER_AGENT} ^

NameOfBadRobot

.* RewriteCond %{REMOTE_ADDR} ^

123\.45\.67\.[8-9]

$ RewriteRule ^

/~quux/foo/arc/

.+ - [

F

]

Блокированные Действующие изображения

описание:

предположить, что мы имеем под http://www.quux-corp.de/~quux/ некоторые страницы с inlined графикой ДЖИФА. Эта графика хороша, таким образом другие, непосредственно включенный их через осуществляют гиперссылку к их страницам. Мы не любим эту практику, потому что это добавляет бесполезное движение к нашему серверу.

решение:

в то время как мы не можем 100 % защищать изображения от включения, мы можем по крайней мере ограничить случаи, куда браузер посылает HTTP Referer удар головой.

RewriteCond %{HTTP_REFERER}

!^$

RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC] RewriteRule

.*\.gif$

- [F]
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !.*/foo-with-gif\.html$ RewriteRule

^inlined-in-foo\.gif$

- [F]

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

описание:

как мы можем запретить определенному хозяину или даже пользователь специального хозяина от использования 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]
top

Other

Внешний Двигатель Переписывания

описание:

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ: Как мы можем решить FOO/BAR/QUUX/etc. проблему? Там не кажется никаким решением при помощи mod_rewrite ...

решение:

использовать внешнее RewriteMap , то есть программа, которая действует как a RewriteMap . этим управляют, как только на запуске Apacheа получает требуемые URL на STDIN и должен поместить окончание (обычно переписанный) URL на STDOUT (тот же самый заказ!).

RewriteEngine on RewriteMap quux-map

prg:

/path/to/map.quux.pl RewriteRule ^/~quux/(.*)$ /~quux/

${quux-map:$1}

#!/path/to/perl # disable buffered I/O which would lead # to deadloops for the Apache server $| = 1; # read URLs one per line from stdin and # generate substitution URL on stdout while (<>) { s|^foo/|bar/|; print $_; }

это - пример только для демонстрации и только переписывает все URL /~quux/foo/... к /~quux/bar/... . фактически Вы можете программировать то, что Вы любите. Но уведомление, что, в то время как такие карты могут быть используемый также средним пользователем, только администратор системы может определить это.