.htaccess не перенаправляє належним чином на сторінку з префіксом www


9

Я намагаюся перенаправити 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-адрес спрацьовують добре.

EDIT: Журнал перезапису містив це:

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:

<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, правда, між ними немає іншого сервера?
Тім Стоун

Я сам не збирав апачі, і тете не було іншого сервера між ними.

ймовірно, ваш сервер NS не налаштований належним чином
venimus

4
Не потрібно повторювати ім’я сервера у записі ServerAlias.
chris

чи можете ви розмістити тут весь вміст файлу
скасувати

Відповіді:


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

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

Існує багато звітів про програми (наприклад, wordpress), які викликають появу цих сторінок перенаправлення за замовчуванням, якщо вони неправильно налаштовані.

Також перевірте решту конфігурації apache, щоб побачити, чи є якісь інші вказівки щодо «переадресації», які можуть бути конфліктними.


Додаток все в порядку, я спробував його на іншому сервері та іншому домені (скопіював весь додаток), і він працював нормально. Я думаю, це щось у конфігурації apache, але я не можу зрозуміти, що.

Додаток може бути нормальним, але може також суперечити налаштуванню на цьому сервері. Здається, ваш додаток наразі виробляється, тому я бачу, як "відключити його" не ідеально. Для задоволення ви можете додати рядок запиту до кінця переадресації як прапор для виявлення - так / $ 1? Nowww = 1 або щось подібне.
Gavin C

Ні, це НЕ у виробництві.

О, здорово, тоді не завадить перемістити індексний файл, щоб на 100% виключити його як частину проблеми :)
Gavin C

О, проклятий, те, що я мав намір написати, що це IS на виробництві, не знаю, як це сталося :-)

0

Чи можете ви спробувати цей альтернативний код mod_rewrite:

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

Це не вдалося точно так само.

чи можете ви ввімкнути RewriteLog і подивитися, що він випливає.
anubhava

І як саме я можу це зробити? :-)

Будь ласка, дивіться тут: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog Єдине, що ця директива переходить у конфігурацію apache НЕ в .htaccess.
anubhava

1
Я скопіював те саме правило (як моя відповідь вище) до моєї установки Apache і запустив ту саму команду curl, яку ви маєте у своєму запитанні, і отримав Location: http://www.domain.com/як частину моїх заголовків, тому в моєму випадку заголовки та html обидва показують один і той же домен, тобто www.domain.com. Чи можете ви також вставити відповідні рядки access.log у своєму запиті вище?
анубхава

0

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


І все-таки це не так :-) (спробував уже, не вийшло)

0

Я сподіваюся, що у вас є доступ до сервера. Додано рядок переадресації після вказаної папки документа сайту

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

Якщо у вас немає доступу до сервера, додайте цей рядок на httaccess, починаючи / змінюючи частину.

Можливо, вам не доведеться додавати "RewriteEngine on" перед перенаправленням.


Я додав RewriteEngine on, як я вже сказав, він працює на іншому сервері належним чином, тільки не на цьому.

AllowOverride Усі дозволяють додавати всі рядки у конфігураційний файл вашого сервера

0

Спробуйте:

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

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?
chris

На фіртках я не хотів використовувати декілька VirtualHosts, але, враховуючи обставини, я все-таки спробував це, і це не допомогло.

0

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


Ні, нічого в хостах про цей домен.

0

Маю другу ідею. Журнал сервера, який ви опублікували, показує адресу "192.168.1.221", яка є адресою з локальної мережі. Чи всі записи журналу показують однакову IP-адресу? У такому випадку між вами та сервером є проксі. Цей проксі, ймовірно, використовує ProxyPassReverseабо Header editдля зміни Locationзаголовка.

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

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

Це означає, що весь час ми дивилися на неправильний сервер: Проблема з проксі-сервером!


Завтра я телефоную в службу технічної підтримки компанії, яка працює на цьому сервері. Я думаю, що це повинно бути, я дам вам знати.
cypher

0

Можуть бути недруковані символи, як null у .htaccessфайлі.

hexdump -C .htaccess

0

Я вважаю, що вам не вистачає знаку $ після умови перезапису. Будь ласка, спробуй:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.