書き換えルールがApacheによって適用されない理由をトラブルシューティングするにはどうすればよいですか?
-
03-07-2019 - |
質問
Apache httpdをフロントエンドとして実行しているTomcat 6 Webアプリがあります。 mod_proxyとmod_proxy_ajpを使用して、リクエストをTomcatに転送しています。私のサーバーはubuntuを実行しています。今、私はmod_rewriteを使用して先頭のwwwを削除しようとしているため、正規のWebサイトのURLは http://domain.com http://www.domain.com
ではなくmod_rewriteの使用に関する多くのチュートリアルを読みましたが、書き換えを機能させることができません。書き換えルールを.htaccessファイルに入れてみました(/ etc / apache / sites-available / defaultファイルを変更してAllowOverride allを設定した後)。書き換えルールをapache2.conf、httpd.conf、rewrite.confに入れてみました。書き換えログを有効にしてこれらすべてを試しました。ログファイルは作成されますが、Apacheは何も書き込みません。 mod_proxyが書き換えルールの使用を何らかの形で妨げているのではないかと考えたので、それも無効にしようとしました...そして、まだ書き換えは行われず、ログには何も記録されません。
この時点では、次に何を試すべきか全く分かりません。 Apacheが書き換えルールを使用しない理由のトラブルシューティングを行うにはどうすればよいですか?
参考のため、ここに私の書き換えディレクティブがあります:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
</IfModule>
編集:以下の回答は私の特定のケースには役立ちますが、Apacheディレクティブの一般的なトラブルシューティング方法に関する回答ほどコミュニティ全体には役立たないでしょう。たとえば、リクエストの受信時にどのディレクティブがどの順序で適用されているかがわかるまでログを有効にする方法はありますか?
編集2 :動作するようになりました。私の仮想ホストは正しくセットアップされていませんでした。また、書き換え正規表現の権利もまったくありませんでした。これが私が仕事に着いた最終的な書き換えディレクティブです。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
解決
質問に答えようとする:Apacheの動作をデバッグするには、 LogLevel をより低いレベル(おそらく debug
)に変更します。ただし、問題のモジュールのログを無効にした場合、 debug
を指定しても、そこからメッセージを取得することはできません。たとえば、デフォルトの [RequestLogLevel] [2]
は0です。たとえば、モジュールはメッセージを書き込みません。 3に設定したが、 RoBorg は、それを 9
に変更すると言いました。これはあなたの場合には低すぎる可能性があります。
問題を解決しようとする:逆形式を使用してホスト名を書き換える方法を変更してみます-ホスト名が目的のものかどうかを確認し、そうでない場合は目的のホスト名に変更します。 Apacheの URL書き換えガイド-Apache HTTPサーバーに記載されているようにサイト:
正規のホスト名
説明: このルールの目標は、特定のホスト名の使用を強制することです 他のホスト名への設定 同じサイトに到達するために使用できます。 たとえば、強制的に 代わりにwww.example.comを使用 example.com、バリアントを使用できます 次のレシピの。解決策:
# To force the use of RewriteEngine On RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^/(.*) http://www.example.com/$1 [L,R]
例では、それらは example.com
から www.example.com
に変わりますが、あなたはそのアイデアを思いつきました。ケースに合わせて調整してください。
他のヒント
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L]
</IfModule>
サーバーで同じ問題が発生しましたが、これは機能しました
最大9までログレベルを上げてみてください。
apacheがログファイルに対して適切な権限を持っていることを確認してください(作成した場合でも、書き込みできる可能性が高いようです)。
RewriteRule。* www.google.com [RL]
これらのルールはどのコンテキストに配置されますか?たとえば、別の仮想ホストの下に配置する場合があります。テストするドメインが1つしかない場合は、コンテナの外に配置してみてください。
いずれの場合も、「no-www」を実現する代替手段があります。これは、www用と「no-www」用の2つの仮想ホストを使用することにあります。 wwwはもう一方にリダイレクトします:
<VirtualHost *:80>
ServerName www.domain.com
Redirect permanent / http://domain.com
</VirtualHost>
<VirtualHost *:80>
ServerName domain.com
#The rest of the configuration (proxying, etc.)
</VirtualHost>