Переписывание ведет себя по-разному в .htaccess vs vhost - PullRequest
2 голосов
/ 26 февраля 2012

Я использую следующую часть инструкций, чтобы переписать www в URL без www:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
</IfModule>

Если я помещу его в файл .htaccess, он будет работать нормально.

Если я помещу его в файл vhost, после перезаписи на хост добавляются две косые черты, например, www.domain.com станет domain.com//

Я что-то упустил?

Кроме того, стоит ли размещать весь контент .htaccess в vhost performancewise?

1 Ответ

5 голосов
/ 26 февраля 2012

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) не будет считываться при каждом доступе к странице.

...