.htaccess を使用して HTTP_HOST を含む URL にリダイレクトするにはどうすればよいですか?
-
09-06-2019 - |
質問
問題
いくつかの短い便利な 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 ソリューションを希望します。
説明
同じサーバーに常駐していません。私は…したい:
- http://例.com/用語/ -> http://サポート.例.com/記事/用語/
- https://安全.例.com/用語/ -> http://サポート.例.com/記事/用語/
- http://dev.example.com/用語/ -> http://サポート.dev.example.com/記事/用語/
- https://安全.dev.example.com/用語/ -> http://サポート.dev.example.com/記事/用語/
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/