web-dev-qa-db-ja.com

Apacheを設定して、ルートをhttpsリダイレクトに加えてサブURIにリダイレクトするにはどうすればよいですか?

一連のWebアプリを実行しているApache Webサーバーがあります。個々のアプリごとに着信httpトラフィックをhttpsに正常にリダイレクトしましたが、ルートパス(何もない)に着信するすべてのトラフィックを特定のアプリにルーティングできません。 httpでは機能しますが、httpsでは機能しません。

したがって、基本的に現在、次のURLは正しくリダイレ​​クトされます。

http://example.com/app1-> https://example.com/app1
http://example.com/app2-> https://example.com/app2など
 http://example.com-> https://example.com/app1

しかし、私はこれをどのように機能させるか理解できません:

https://example.com-> https://example.com/app1

私のApache設定ファイルには以下が含まれています:

<VirtualHost xxx.xxx.xxx.xx:80>
  ServerName example.com

  RedirectMatch 301 ^/$ /app1/
  Redirect permanent / https://example.com/
</VirtualHost>

次のようなRewriteCond/RewriteRuleペアを追加してみました

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule ^/$ https://example.com/app1 [R=301,L]

同様に、私が機能するはずだと思った他の多くのことも、それらは何もしないか、私の構成の他の部分を壊しているようです。

このサーバー上のアプリを指す他のドメインもあるので、SSL証明書がマルチドメインであることが重要な場合。これらはすべて、次のようにすれば完全に問題なく動作します(ただし、リダイレクトに関する追加の要件はありません)。

<VirtualHost xxx.xxx.xxx.xx:80>
  ServerName example2.com

  Redirect permanent / https://example2.com/
</VirtualHost>

では、他に何も壊すことなく、httpsをrootからsuburiにリダイレクトするにはどうすればよいですか?

1
Maltiriel

Httpとhttpsの同じRewriteRuleでうまくいくはずです。他にある場合は、それらを最初に置いてください。私はmod_aliasよりもmod_rewriteを好みます。

<VirtualHost xxx.xxx.xxx.xx:80>
    ServerName example.com

    RewriteEngine On
    RewriteRule ^/$ https://example.com/app1 [R=301,L]
</VirtualHost>

<VirtualHost xxx.xxx.xxx.xx:443>
    ServerName example.com

    RewriteEngine On
    RewriteRule ^/$ https://example.com/app1 [R=301,L]
</VirtualHost>
2
Gerard H. Pille

mod_rewrite よりも mod_alias を優先するGerardの答えは、これがmod_aliasを使用して達成できなかったという幻想を残しています。 Apacheの公式ドキュメントによると:

mod_rewriteを使用しない場合

mod_rewrite は、他の代替手段が必要であることが判明した場合、最後の手段と見なす必要があります。より簡単な代替手段があるときにそれを使用すると、構成が混乱しやすく、壊れやすく、保守が困難になります。他にどのような選択肢があるかを理解することは、 mod_rewrite の習得に向けた非常に重要なステップです。

シンプルなリダイレクト

mod_alias は、 Redirect および RedirectMatch ディレクティブを提供します。これは、1つのURLを別のURLにリダイレクトする手段を提供します。このような1つのURLまたはURLのクラスの別の場所への単純なリダイレクトは、 RewriteRule ではなく、これらのディレクティブを使用して実行する必要があります。 RedirectMatchを使用すると、リダイレクト基準に正規表現を含めることができ、RewriteRuleを使用する利点の多くが提供されます。

RedirectMatch 301 ^/$ /app1/の唯一の問題は、最後のパラメーターがURLではなく相対参照であることです。

RedirectMatchディレクティブ

構文:RedirectMatch [status] regex URL

Mod_aliasを使用した完全な構成は次のようになります。

<VirtualHost *:80>
    ServerName example.com

    RedirectMatch 301 ^/$ https://example.com/app1/
    Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com

    RedirectMatch 301 ^/$ https://example.com/app1/
</VirtualHost>
2
Esa Jokinen