web-dev-qa-db-ja.com

.htaccessがwww-prefixedページに正しくリダイレ​​クトされない

WwwなしでURLをリダイレクトしようとしています。 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>

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');

まったく同じリダイレクトループが発生します。真剣に、一体何?誰かがこれを引き起こしている可能性があるものについての考えを持っていますか?

9
cypher

奇妙なことに私を驚かせるのはLocation: http://domain.cz/CURLによって報告されたヘッダー行。そのドメインにリダイレクトすることはありません。リダイレクトログにもその言及は含まれていません。

どういうわけか、modrewriteが処理を行った後、Locationヘッダーが変更されたようです。また、ヘッダーをPHPでも変更しようとしたため、Locationヘッダーは明らかにリクエストが処理された後に変更されました。私が考えることができる唯一の説明は、どこかでmod_headerを使用してロケーションヘッダーを変更しているということです。

次のような行が見つかった場合は、すべての構成ファイル(httpd.conf、含まれている.confファイル、および.htaccessファイル)を確認しましたか。

Header set Location (...)

または

Header edit Location (...)
2
Jakob Egger

Rewritelogを有効にすることに加えて(httpd.confを変更するためのアクセス権がある場合)、このサイトにあるアプリケーションを方程式から削除する必要があります。デフォルトのindex.php(またはアプリに提供されているインデックスページ)を一時的に削除/名前変更して、これが原因ではないことを確認します。

設定が間違っていると、これらのApacheのデフォルトのリダイレクトページが表示される原因となるアプリケーション(ワードプレスなど)に関する多くの報告があります。

また、Apache構成の残りの部分をチェックして、競合する可能性のある他の「リダイレクト」命令があるかどうかを確認します。

1
Gavin C

私は2番目のアイデアがあります。投稿したサーバーログには、ローカルネットワークからのアドレスである「192.168.1.221」のアドレスが表示されます。すべてのログエントリに同じIPアドレスが表示されていますか?この場合、ユーザーとサーバーの間にプロキシがあります。このプロキシは、おそらくProxyPassReverseまたはHeader editを使用してLocationヘッダーを変更します。

これは、バックエンドサーバーが外部プロキシサーバーのホスト名ではなく、独自のホスト名をLocationヘッダーに配置する場合の問題を回避するための通常の設定です。

実際にプロキシサーバーが存在する場合、プロキシは常に情報を上書きするため、バックエンドサーバーの構成ではなく、プロキシサーバーの構成を変更する必要があります。

これは、私たちがいつも間違ったサーバーを見ていることを意味します:問題はプロキシサーバーにあります!

0
Jakob Egger

.htaccessファイルのnullのような印刷できない文字である可能性があります。

hexdump -C .htaccess
0
Charlie

書き換え条件の後に$記号がないようです。してみてください:

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

この代替のmod_rewriteコードを試すことができますか?

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

[nc]の代わりに[NC]を使用してみてください。とても簡単かもしれません。

0
venimus

サーバーにアクセスできることを願っています。指定されたサイトドキュメントフォルダの後にリダイレクト行を追加しました。

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

サーバーへのアクセス権がない場合は、httaccessの開始時にそれらの行を追加/部分を変更します。

リダイレクトの前に「RewriteEngineon」を追加していない可能性があります。

0
Thilak

試してください:

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

必ずOptions +FollowSymLinksディレクトリコンテキスト内で作業している場合。

それ以外の場合、名前ベースの仮想ホストを使用している場合は、次のことを試してください。

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

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

すべての回答を読んだ後、/ etc/hostsファイルをチェックできます...おそらくすべてのチェックはコンピューターからのものです。別の場所からアクセスしてみてください。

0
Gonza