Apache Версия 2.0 Сервера HTTP
этот документ добавляется
mod_rewrite
reference documentation
. это описывает, как можно использовать Апача
mod_rewrite
решить типичные проблемы НА ОСНОВЕ URL, с которыми webmasters являются commonony, которому противостоят. Мы даем детализированные описания о том, как решить каждую проблему, формируя URL, переписывая rulesets.
[PT]
флаг, дополнительно используя
mod_alias
и
mod_userdir
, и т.д. Или переписывая ruleset, чтобы сойтись
.htaccess
контекст вместо в-сервер контекста. Всегда пробуйте понять то, что действительно делает специфический ruleset прежде, чем Вы используете это. Это избегает многих проблем.
DocumentRoot
на некотором webservers есть больше чем один URL для ресурса. Обычно есть канонические URL (который должен фактически использоваться и распределен), и те, которые являются только shortcuts, внутренние, и т.д. Независимый, из какого URL пользователь снабжал запросом, он должен наконец видеть канонический только.
мы делаем внешний HTTP переадресовывает для всех неканонических URL, чтобы установить их в представлении местоположения Браузера и для всех последующих запросов. В примере ruleset ниже мы заменяем
/~user
каноническим
/u/user
и установите отсутствие, тащащее разрез для
/u/user
.
RewriteRule ^/ ~ ([^/]+)/?(.*) / u /$1/$2 [ R ] RewriteRule ^/([uge])/( [^/]+ )$ /$1/$2 / [ R ]
для участков, бегущих на порту кроме 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]
DocumentRoot
обычно
DocumentRoot
из webserver непосредственно имеет отношение с URL "
/
". Но часто эти данные не действительно высокопоставленного приоритета. Например, Вы можете желать посетителей, на первом входе в участок, пойти в специфический подсправочник
/about/
. это может быть достигнуто, используя следующий ruleset:
мы переадресовываем URL
/
к
/about/
:
RewriteEngine on RewriteRule ^/$ /about/ [ R ]
отметить, что это может также быть обработано, используя
RedirectMatch
директива:
RedirectMatch ^/$ http://example.com/e/www/
с огромным большинством "перемещения разреза" проблемы можно иметь дело с использованием методов, обсужденных в 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]
много webmasters спросили решение следующей ситуации: Они хотели переадресовать только весь homedirs на webserver к другому webserver. Они обычно нуждаются в таких вещах, устанавливая более новый webserver, который заменит старый в течение долгого времени.
решение тривиально с
mod_rewrite
. на старом webserver мы только переадресовываем все
/~user/anypath
URL к
http://newserver/~user/anypath
.
RewriteEngine on RewriteRule ^/~(.+) http:// newserver /~$1 [R,L]
иногда необходимо позволить поиску 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]
возможно Вы хотите держать информацию статуса между запросами и использовать URL, чтобы закодировать это. Но Вы не хотите использовать обертку CGI для всех страниц только, чтобы раздеть эту информацию.
мы используем переписывающееся правило раздеть информацию статуса и помнить это через переменную окружающей среды, которая может быть более поздним dereferenced изнутри XSSI или CGI. Этим путем URL
/foo/S=java/bar/
переведен к
/foo/bar/
и названная переменная окружающей среды
STATUS
собирается ценность "Ява".
RewriteEngine on RewriteRule ^(.*)/ S=([^/]+) /(.*) $1/$3 [E= STATUS:$2 ]
предположить, что Вы хотите обеспечить
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
мы хотим переадресовать homedir URL к другому webserver
www.somewhere.com
когда пользователь требования не остается в местной области
ourdomain.com
. это иногда используется в действительных контекстах хозяина.
только переписывающееся условие:
RewriteEngine on RewriteCond %{REMOTE_HOST} !^.+\.ourdomain\.com$ RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]
по умолчанию, переадресовывание на якорь HTML не работает, потому что mod_rewrite убегает
#
характер, поворачивая это в
%23
. это, в свою очередь, нарушает переназначение.
использование
[NE]
флаг на
RewriteRule
. НЕОН не поддерживает Никакого Спасения.
когда уловки как зависимое временем содержание должны случиться, что много 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
. только хорошая особенность начальной страницы...
как может мы делать 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
предположить, что мы недавно переименовали страницу
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 ]
как мы можем блокировать действительно раздражающий робот от восстановления страниц определенного 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]
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ: Как мы можем решить 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/...
. фактически Вы можете программировать то, что Вы любите. Но уведомление, что, в то время как такие карты могут быть
используемый
также средним пользователем, только администратор системы может
определить
это.