Apache RewriteRule が正しく動作しません。

Apache RewriteRule が正しく動作しません。

Apacheを使って次のことをしようとしています。

http(s)://domain.local(/) を要求したら、https://www.domain_new.local などの新しいドメインにリダイレクトする必要があります。

私が尋ねるとhttp://domain.local/gp次にリダイレクトする必要があります。https://domain.local/gp

以下を試しましたが、うまくいかないようです。

<VirtualHost *:80>
    ServerName domain.local

    DocumentRoot "/var/www/html/"
    
    # html directory contains gp directory 
    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    RewriteEngine on

    RewriteCond "%{HTTP_HOST}%{REQUEST_URI}" "^domain\.local\/?$"
    RewriteRule "^domain\.local\/?$" "https://domain_new.local"

    RewriteCond "%{HTTP_HOST}%{REQUEST_URI}" "^domain\.local\/gp(.*)"
    RewriteRule "^/?(.*)" "https://%{SERVER_NAME}/$1"
</VirtualHost>


<VirtualHost *:443>
    ServerName domain.local

    DocumentRoot "/var/www/html/" 
    
    SSLEngine on
    
    # html directory contains gp directory     
    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    SSLCertificateFile /etc/pki/tls/certs/domain.local.crt
    SSLCertificateKeyFile /etc/pki/tls/private/domain.local.key
    SSLCertificateChainFile /etc/pki/tls/certs/domain.local.ca-bundle
</VirtualHost>

答え1

私はテストしていませんが、いくつかの(潜在的な)問題を発見しました。

  • RewriteCond "%{HTTP_HOST}%{REQUEST_URI}" "^domain\.local\/?$"
    以前も問題がある可能性があります\。一般的に改行するので参加する/理由はありません。REQUEST_URIRewriteCondRewriteRule
  • RewriteRule "^domain\.local\/?$"
    ドメインがそこに属していません。一意にRewriteRule一致しますREQUEST_URI
  • https://domain.localHTTPS 構成に書き換え規則がありません。

答え2

解決策は思ったよりはるかに簡単です。すべてのHTTPをHTTPSにリダイレクトしてから、443仮想ホストで実際の書き換えを処理します。実際のリダイレクトは、443仮想ホストと私が使用した正規表現で発生する必要があると指摘した@Hauke Lagingのおかげで、エラーも発生しました。この記事1回のリダイレクトでhttps、www、末尾のスラッシュを強制する方法読むのも楽しいです。

<VirtualHost *:80>
    ServerName domain.local

    DocumentRoot "/var/www/html/"
    
    # html directory contains gp directory 
    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>


<VirtualHost *:443>
    ServerName domain.local

    DocumentRoot "/var/www/html/"

    RewriteEngine on
    RewriteCond "%{HTTP_HOST}%{REQUEST_URI}" "^domain\.local\/?$"
    RewriteRule .* https://domain_new.local
    
    SSLEngine on
    
    # html directory contains gp directory     
    <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    SSLCertificateFile /etc/pki/tls/certs/domain.local.crt
    SSLCertificateKeyFile /etc/pki/tls/private/domain.local.key
    SSLCertificateChainFile /etc/pki/tls/certs/domain.local.ca-bundle
</VirtualHost>

関連情報