Назад | Перейти на главную страницу

.htaccess не перенаправляет на страницу с префиксом www.

Я пытаюсь перенаправить URL без www. на www.version (с example.com на www.example.com). Я использую обычный

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Это работает во всех моих других проектах. Однако на этом конкретном сайте он заканчивается циклом перенаправления. Вот что странно: я попытался скрутить версию без www, чтобы посмотреть, какие заголовки она отправляет, используя curl --get http://example.com --dump-header domain.header > domain.html. Заголовочный файл выглядел так:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

Однако получившийся HTML-файл был таким:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(обратите внимание на разницу адресов между файлами) Кто-нибудь знает, как это исправить (и что, черт возьми, вызывает это)? Любые другие директивы перезаписи URL работают нормально.

РЕДАКТИРОВАТЬ: журнал перезаписи содержал следующее: (к сайту обращаются многие люди, поэтому журнал перезаписи получился довольно длинным, я не уверен на 100%, правильная ли это часть)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

Строка журнала доступа (наверное, правильная):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

Определение виртуального хоста:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

РЕДАКТИРОВАТЬ2: хорошо, я только что понял, что если я это сделаю (ушел в отставку и попытался перенаправить это без .htaccess):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

Это вызывает ТОЧНО ТАК ЖЕ цикл перенаправления. Серьезно, какого черта? Кто-нибудь знает, что может быть причиной этого?

Что мне кажется странным, так это то, что Location: http://domain.cz/ строка заголовка, сообщаемая CURL. Вы никогда не перенаправляете на этот домен. Журнал перенаправления также не содержит упоминания об этом.

Как-то Location Кажется, что заголовок изменился после того, как modrewrite сделал свое дело, и, поскольку вы также пытались изменить заголовок с помощью PHP, Location заголовок явно изменяется после обработки запроса. Единственное объяснение, которое я могу придумать, это то, что вы где-то изменяете заголовок местоположения с помощью mod_header.

Вы проверили все файлы конфигурации (httpd.conf, включенные файлы .conf и файл .htaccess), если где-нибудь найдете строку, похожую на эту:

Header set Location (...)

или

Header edit Location (...)

В дополнение к включению перезаписи журнала (если у вас есть доступ для изменения httpd.conf) вы должны удалить приложение, которое живет на этом сайте, из уравнения. Временно удалите / переименуйте index.php по умолчанию (или любую другую индексную страницу, обслуживающую ваше приложение), чтобы убедиться, что это не вызывает этого.

Есть много отчетов о приложениях (например, wordpress), вызывающих появление этих страниц перенаправления по умолчанию apache, если они неправильно настроены.

Кроме того, проверьте остальную часть конфигурации apache, чтобы увидеть, есть ли какие-либо другие инструкции «перенаправления», которые могут конфликтовать.

Надеюсь, у вас есть доступ к серверу. Добавлена ​​строка перенаправления после указанной папки документа сайта.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

Если у вас нет доступа к серверу, добавьте эту строку в httaccess, чтобы начать / изменить часть.

Может быть, вы не добавляли RewriteEngine перед перенаправлением.

не могли бы вы использовать [NC] вместо [NC], это может быть так просто

Можете ли вы попробовать этот альтернативный код mod_rewrite:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Пытаться:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

Обязательно иметь Options +FollowSymLinks если вы работаете в контексте каталога.

В противном случае, если вы используете виртуальные хосты на основе имен, попробуйте:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

Прочитав все ответы, вы можете проверить файл / etc / hosts ... возможно, все ваши проверки сделаны с вашего компьютера. Попробуйте получить доступ из другого места.

У меня есть вторая идея. В опубликованном вами журнале сервера указан адрес «192.168.1.221», который является адресом из локальной сети. Все ли записи журнала показывают один и тот же IP-адрес? В этом случае между вами и сервером есть прокси. Этот прокси, вероятно, использует ProxyPassReverse или Header edit изменить Location заголовок.

Это обычная установка для обхода проблемы, когда внутренний сервер помещает собственное имя хоста в Location заголовок, а не имя хоста внешнего прокси-сервера.

Если действительно существует прокси-сервер, вам придется изменить конфигурацию прокси-сервера, а не конфигурацию внутреннего сервера, поскольку прокси всегда будет перезаписывать информацию.

Это означает, что мы все время смотрели не на тот сервер: проблема в прокси-сервере!

Могут быть непечатаемые символы, такие как null в .htaccess файл.

hexdump -C .htaccess

Я считаю, что после условия перезаписи вам не хватает знака $. Пожалуйста попробуйте:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]