.htaccess を使用して HTTP_HOST を含む URL にリダイレクトするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/72458

質問

問題

いくつかの短い便利な URL を長い実際の URL にリダイレクトする必要があります。問題のサイトは、一連の開発バージョンまたはライブ バージョンを識別するために一連のサブドメインを使用しています。

ホストごとにカスタム .htaccess ファイルを作成する必要がないように、特定のリクエストのリダイレクト先となる URL に HTTP_HOST を含めたいと考えています。

ホスト固有の例 (.htaccess ファイルから抜粋)

Redirect /terms http://support.dev01.example.com/articles/terms/

この例は、dev01.example.com で実行されている開発バージョンでは正常に動作します。dev02.example.com で実行されている開発バージョンのメイン .htaccess ファイルで同じ行を使用すると、間違った場所にリダイレクトされてしまいます。

理想的なルール (正しい構文がわからない)

Redirect /terms http://support.{HTTP_HOST}/articles/terms/

このルールは機能せず、単に私が達成したいことの一例として機能します。その後、多くの異なるホストでまったく同じルールを使用して、正しい結果を得ることができました。

答えは?

  • これは mod_alias で実行できますか、それともより複雑な mod_rewrite が必要ですか?
  • mod_alias または mod_rewrite を使用してこれを実現するにはどうすればよいでしょうか?可能であれば、mod_alias ソリューションを希望します。

説明

同じサーバーに常駐していません。私は…したい:

example.com と dev.example.com の両方の .htaccess ファイルで同じルールを使用できるようにしたいと考えています。この状況では、リクエストのリダイレクト先となる URL で HTTP_HOST を文字通りに指定するのではなく、変数として HTTP_HOST を参照できる必要があります。

提案されたように HTTP_HOST パラメーターを調査しますが、実際に動作する例を期待していました。

役に立ちましたか?

解決

誰も実際にやっていないのは奇妙だ 働く 答えます(笑):

RewriteCond %{HTTP_HOST} support\.(([^\.]+))\.example\.com
RewriteRule ^/terms http://support.%1/article/terms [NC,QSA,R]

作業をより迅速に行うために、正規表現をチェックするための私のお気に入りのツール:

http://www.quanetic.com/Regex (preg(PCRE) の代わりに ereg(POSIX) を選択することを忘れないでください。)

このツールは、URL が有効かどうかを確認するときに使用します。

他のヒント

HTTP_HOST 値を取得して、それを書き換えルールで使用するとよいでしょう。

RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/terms http://support.%1/article/terms [NC,R=302]

質問の意味が正しければ、301 リダイレクト (ブラウザに他の URL に移動するよう指示) が必要ということになります。私の解決策があなたにとって適切でない場合は、次のツールを試してください。 http://www.htaccessredirect.net/index.php そして何が自分にとって効果があるのか​​を考えてください。

//301 Redirect Entire Directory
RedirectMatch 301 /terms(.*) /articles/terms/$1

//Change default directory page
DirectoryIndex 

このチートシートによると ( http://www.addedbytes.com/download/mod_rewrite-cheat-sheet-v2/png/ )これはうまくいくはずです

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain2.com/$1

これをテストする方法がないので、これは明示的な答えではなく、正しい方向へのポインターとして解釈されるべきであることに注意してください。

同じサーバー上に滞在している場合、これを .htaccess に置くと、サーバーに関係なく機能します。

RedirectMatch 301 ^/terms$ /articles/terms/

生産物:

http://example.com/terms -> http://example.com/articles/terms

または:

http://test.example.com/terms -> http://test.example.com/articles/terms

明らかに、スローしようとしているものに確実に対応できるように、REGEX のマッチングなどを調整する必要があります。301 についても同様で、ブラウザにリダイレクトをキャッシュさせたくない場合は 302 が必要になる場合があります。

あなたが望むなら:

http://example.com/terms -> http://server02.example.com/articles/terms

次に、HTTP_HOST パラメータを使用する必要があります。

この情報を含める必要はありません。ルートに相対的な URI を指定するだけです。

Redirect temp /terms /articles/terms/

これについては、 mod_alias ドキュメント:

新しい URL はスキームとホスト名で始まる絶対 URL である必要がありますが、スラッシュで始まる URL パスも使用できます。その場合、現在のサーバーのスキームとホスト名が追加されます。

本当に必要なのはエイリアスだけのようですね?

Alias /terms /www/public/articles/terms/
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top