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

9

Я пытаюсь перенаправить URL без www. на www.version (пример.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>

EDIT2: хорошо, я просто понял, что если я сделаю это (подал в отставку и попытался перенаправить это без .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');

Это вызывает точно такой же цикл перенаправления. Серьезно, какого черта? У кого-нибудь есть идея, что может быть причиной этого?

зашифровывать
источник
Вы сами компилировали Apache или? Должно быть невозможно, чтобы заголовок Location отличался от того, что находится на странице, поскольку они взяты из одной и той же переменной в этом случае, так что это довольно странно. Я предполагаю, что запросы передаются напрямую в Apache, верно, между ними нет другого сервера?
Тим Стоун
Я не собирал apache сам, и между ними нет другого сервера.
возможно ваш NS сервер не настроен должным образом
venimus
4
Нет необходимости повторять имя сервера в записи ServerAlias.
Крис
Вы можете поместить все содержимое файла здесь
отменить

Ответы:

2

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

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

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

Header set Location (...)

или

Header edit Location (...)
Якоб Эггер
источник
Я не нашел ничего подобного.
2
Вы напрямую подключаетесь к Apache или между ними есть какой-то кеширующий или прокси-сервер, который может изменить заголовки? Директива ProxyPassReverse может также изменить заголовок расположения ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).
между ними может быть прокси, я посмотрю его, как только доберусь до работы завтра.
@Jakob Egger - я нигде не нашел директивы ProxyPassReverse.
cypher
1

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

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

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

Гэвин С
источник
С приложением все в порядке, я попробовал его на другом сервере и в другом домене (скопировал все приложение), и все заработало нормально. Я думаю, что-то в конфигурации Apache, но я не могу понять, что.
Приложение может быть в порядке, но может также конфликтовать с настройкой на этом сервере. Похоже, ваше приложение в данный момент находится в производстве, поэтому я вижу, что «отключение» не является идеальным. Для забавы вы можете добавить строку запроса в конец перенаправления в качестве флага, чтобы помочь обнаружению - так / $ 1? Nowww = 1 или что-то подобное.
Гэвин C
Нет, это НЕ в производстве.
О, круто, тогда не помешает переместить файл индекса с пути на 100%, исключив его как часть проблемы :)
Gavin C
О, черт возьми, я хотел написать, что это в производстве, не знаю, как это произошло :-)
0

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

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
анубхава
источник
Это не удалось точно так же.
Можете ли вы включить RewriteLog и посмотреть, что он выплевывает.
анубхава
И как именно я могу это сделать? :-)
Пожалуйста, смотрите здесь: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Единственное, что эта директива входит в конфигурацию apache, а не в .htaccess.
анубхава
1
Я скопировал же правило (как мой ответ выше) для моей установки Apache и побежал ту же команду локон у вас есть в вашем вопросе и получил Location: http://www.domain.com/как часть моих заголовков так в моем случае заголовки и HTML , как показывают тот же домен т www.domain.com. Вы также можете вставить соответствующие строки access.log в свой вопрос выше?
анубхава
0

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

venimus
источник
И все же это не так :-) (пробовал уже, не сработало)
0

Я надеюсь, что у вас есть доступ к серверу, добавлена ​​строка перенаправления после того, как папка документа сайта указала

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

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

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


источник
Я добавил RewriteEngine on, как я уже сказал, он работает на другом сервере должным образом, но не на этом.
AllowOverride Все разрешают из всех добавлять эти строки в файл конфигурации вашего сервера
0

Пытаться:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]
Shef
источник
0

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

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

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

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>
Крис
источник
Я обновил вопрос с определением VirtualHost.
Вы попробовали вышеупомянутое множественное решение VirtualHost или вы используете mod_rewrite?
Крис
Во-первых, я не хотел использовать несколько виртуальных хостов, но, учитывая обстоятельства, я все равно попробовал, и это не помогло.
0

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


источник
Нет, ничего в хостах об этом домене.
0

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

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

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

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

Якоб Эггер
источник
Завтра я звоню в техподдержку компании, которая управляет этим сервером. Я думаю, что это должно быть так, я дам вам знать.
cypher
0

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

hexdump -C .htaccess
Чарли
источник
0

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

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
cormpadre
источник