.htaccessがwwwで始まるページに適切にリダイレクトしない


9

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の定義:

<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によって報告されるヘッダー行です。そのドメインにリダイレクトすることはありません。リダイレクトログにも、それに関する記述は含まれていません。

どういうわけか、LocationmodrewriteのLocation処理後にヘッダーが変更されたように見え、PHPでもヘッダーを変更しようとしたため、リクエストの処理後にヘッダーが変更されたようです。私が考えることができる唯一の説明は、あなたが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ディレクティブがどこにも見つかりません。
サイファー、2011

1

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

アプリケーション(ワードプレスなど)の多くのレポートがあり、これらのapacheのデフォルトのリダイレクトページは、正しく構成されていない場合に表示されます。

また、Apacheの残りの設定をチェックして、競合している可能性のある他の「リダイレクト」指示がないかどうかを確認します。


アプリケーションは問題なく、別のサーバーと別のドメイン(アプリケーション全体をコピーしたもの)で試してみましたが、問題なく動作しました。私はそれがApacheの設定にあるものだと思いますが、私は何を理解することができません。

アプリは問題ないかもしれませんが、このサーバーの設定と競合している可能性もあります。あなたのアプリは現在生産中のようですので、「無効にする」ことが理想的でないことがわかります。楽しみのために、発見を助けるフラグとしてクエリ文字列をリダイレクトの最後に追加するかもしれません-/ $ 1?nowww = 1か似たようなもの。
ギャビンC

いいえ、生産されていません。


ああ、のろわれ、私が書き込みを意味することは知らん、そのTISが生産されていたか:-)このhappenned

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唯一のことは、このディレクティブが.htaccessではなくapache configに入るということです。
anubhava

1
(上記の私の回答と同じ)ルールをApacheインストールにコピーし、質問にある同じcurlコマンドを実行しLocation: http://www.domain.com/、ヘッダーの一部として取得したため、私の場合、ヘッダーとhtmlの両方が同じドメインを表示していますwww.domain.com。上記の質問に関連するaccess.log行を貼り付けることもできますか?
anubhava

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 Allすべての許可により、サーバー構成ファイルにこれらの行を追加します

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を使用することにしましたか?
クリス

最初は、複数のVirtualHostを使いたくありませんでしたが、状況を考えるととにかく試してみましたが、役に立ちませんでした。

0

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


いいえ、そのドメインに関するホストには何もありません。

0

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

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

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

これは、常に間違ったサーバーを見ていたことを意味します。問題はプロキシサーバーにあります。


明日、このサーバーを運用している会社のテクニカルサポートに連絡します。それはそれだと思います、お知らせします。
サイファー、2011

0

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

hexdump -C .htaccess

0

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

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.