RewriteRule
ведет себя так, как говорят документы.
Существует разница в том, с чем RewriteRule
совпадает, когда в VirtualHost
контексте и Directory & .htaccess
контексте.
С Директива RewriteRule Документы Apache
Что совпадает?
В контексте VirtualHost шаблон будет сначала сопоставляться с частью URL после имени хоста и порта и перед строкой запроса (например, "/app1/index.html").
В контексте Directory и htaccess шаблон будет первоначально сопоставлен с путем к файловой системе после удаления префикса, который приводит сервер к текущему RewriteRule (например, «app1 / index.html» или «index.html» в зависимости от того, где директивы определены).
Если вы хотите сопоставить имя хоста, порт или строку запроса, используйте RewriteCond с переменными% {HTTP_HOST},% {SERVER_PORT} или% {QUERY_STRING} соответственно.
Таким образом, если в VirtualHost
сервер не находится в контексте directory
, поэтому префикс /
не будет удален. Также помните, что при сопоставлении с RewriteRule
в VirtualHost
контексте шаблон всегда начинается с /
.
Итак, ваш RewriteRule
должен быть:
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R=301,NC,L]
в VirtualHost
контексте.
Кроме того, стоит ли размещать весь контент .htaccess в vhost performancewise?
Да, определенно. Одна из причин заключается в том, что файл (.htaccess
) не будет считываться при каждом доступе к странице.