apache mod_rewrite перенаправление между именами хостов (кроме одного каталога) - PullRequest
1 голос
/ 30 сентября 2010

У меня есть два имени хоста (например, www.site1.com и www.site2.com), сопоставленных одному и тому же виртуальному хосту apache. Я хотел бы перенаправить весь трафик с site1.com на site2.com, , за исключением для всех запросов POST из определенной папки. (Эта папка содержит URL-адреса, которые используются более старыми клиентами, которые не способны обрабатывать перенаправления на запросы POST.)

Вот правило, которое я придумал. Я новичок в переписывании правил, поэтому хотел убедиться, что я не пропустил ничего очевидного.

RewriteCond %{HTTP_HOST} ^www.site1.com$
RewriteCond %{HTTP_METHOD} ^POST
RewriteCond %{REQUEST_URI} !^/dontredirectme/
RewriteRule /(.*) http://www.site2.com/$1 [R=301,L]

Это правильное правило для этой работы? И если да, есть ли какие-либо оптимизации эффективности, которые я должен рассмотреть?

1 Ответ

2 голосов
/ 01 октября 2010

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

RewriteCond %{HTTP_METHOD} !^POST [OR]

Это позволит вам перенаправить, если тип запроса не POST, или , и запрашиваемый URI не / dontredirectme ​​/ , что фактически приводит к перенаправлению для всего, что не является запросом POST, к / dontredirectme ​​/ .

Кроме того, входные данные для RewriteRule не будут иметь начальную косую черту, если вы определяете их в контексте для каждого каталога (в файле .htaccess или в разделе <Directory>). Если вы определяете его непосредственно в <VirtualHost> (для каждого сервера), то ввод будет иметь косую черту, поэтому ваше правило будет нормальным.

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

Если вы действительно хотите выжать из этого эффективность, вы можете внести следующие изменения:

RewriteCond %{HTTP_HOST}    =www.example.com
RewriteCond %{HTTP_METHOD} !=POST [NC,OR]
RewriteCond %{REQUEST_URI} !^/dontredirectme/
RewriteRule ^ http://www.example.net%{REQUEST_URI} [R=301,L]

Я сомневаюсь, что разница действительно заметна во всех случаях, кроме самых крайних, но это убирает два регулярных выражения в пользу прямого сравнения текста. Кроме того, поскольку вы просто хотите перенаправить запрос на новый дословный хост, вы можете «упростить» регулярное выражение, включенное в RewriteRule, и просто использовать %{REQUEST_URI} непосредственно при замене.

...