HTTP_HOSTに基づいてURLを書き換える

HTTP_HOSTに基づいてURLを書き換える

基本的に、ユーザーがイントラネットとインターネット経由でページにアクセスできるようにしたいと考えています。

ユーザーがイントラネット経由でページにアクセスする場合、ブラウザのアドレスバーにサーバーのイントラネットIPを入力すると、192.168.x.x

しかし、ユーザーがインターネット経由でページにアクセスすると、サーバーのパブリック IP を入力できるため、URL をサーバーのパブリック IP に書き換えます。

試してみましたが、ページが表示されません適切にリダイレクトされていない

RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteCond     %{HTTP_HOST}        !192.168.0.1
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]
RewriteCond     %{HTTP_HOST}        !<public.ip.of.server>
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]

私もこれを試してみましたが、ページが表示されました500内部サーバーエラー

<If "%{HTTP_HOST} == '192.168.0.1'">
RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]
</If>
<If "%{HTTP_HOST} == 'public.ip.of.server'">
RewriteEngine   On
RewriteBase     /mypath/
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]
</If>

何か間違ったことをしているのでしょうか?

答え1

私はApache 2.2.3を使用しています

<If>ディレクティブはApache 2.4のコアの一部ですこれらのディレクティブを 2.2 に配置すると、500 サーバー エラーが発生します。何をしようとしているのかまったくわかりませんが、ブロックを<If>単純な に置き換えることができますRewriteCond

ここで重要な概念はRewriteCond直後にのみ適用される RewriteRuleディレクティブを複数指定すると、他のディレクティブには適用されず、そのディレクティブのみに適用されます。したがって、複数のルールに適用する必要がある場合は、条件を複製する必要があります。

RewriteEngine   On
RewriteBase     /mypath/

RewriteCond     %{HTTP_HOST} ^192.168.0.1$
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://192.168.0.1/mypath/$1/   [L,R=301]

RewriteCond     %{HTTP_HOST} ^public.ip.of.server$
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$          http://<public.ip.of.server>/mypath/$1/ [L,R=301]

しかし、ビットを使用せずにリダイレクトできるため、これらすべてを取り除くことができますhttp://hostname

RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_URI}      !(.*)/$
RewriteCond     %{REQUEST_METHOD}   GET
RewriteRule     ^(.*)$  /mypath/$1/   [L,R=301]

これにより、どのホストでも上記を実現できます。

関連情報