bugfix> mod-rewrite > 投稿

Apache2 VirtualHost上のDocumentRootからサブディレクトリ/ archive /に多数のファイルを移動し、ApacheがDocumentRootでファイルを見つけられない場合に/ archive /で検索するようにmod_rewriteルールを確立します。これは私が今持っているものです:

<VirtualHost *:80>
    ServerName myserver.com
    ServerAlias www.myserver.com
    ServerAdmin admin@myserver.com
    DocumentRoot /var/www/myserver.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    RewriteEngine On
    # Disable HTTP methods other than GET and POST
    RewriteCond %{REQUEST_METHOD} !^(GET|POST)
    RewriteRule .* - [R=405]
    # Redirect to moved files
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/(.*)$ /archive/$1
    # Force HTTPS
    RewriteCond %{SERVER_NAME} =myserver.com [OR]
    RewriteCond %{SERVER_NAME} =www.myserver.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

HTTPリクエストメソッドを無効にし、httpsを強制するルールは正常に機能しますが、移動したファイルのリダイレクトはうまくいかず、その理由はわかりません。

この質問は最初の書き換えで結果が得られない場合の書き換えの使用方法(別の場所で検索) 問題は、1)誤った仮想ホストに配置され、2)%{REQUEST_FILENAME}が完全を返さないために機能しない単一フォルダリダイレクトルールであったが、ファイルの複数のディレクトリをチェックする条件を記述する方法があったためです。ファイルへのパス。 50325200の答えはどれも、私が抱えていた問題を解決したり対処したりするものではありません。

回答 1 件
  • 多くのトラブルシューティングを行った後、2つの問題があることを発見しました。すべてのhttpトラフィックをhttpsにリダイレクトするように書き換えていたため、書き換えは元に戻されていました。これらの書き換えルールを*:443のVirtualHostに移動すると、問題の一部が解決しました。

    もう1つの問題は、VirtualHost内で%{REQUEST_FILENAME}がファイルへのフルパスを返さず、生のURIのみを返していたことです。 Rewriteの条件を次のように変更する必要がありました。

    RewriteCond /var/www/myserver.com/public_html%{REQUEST_FILENAME} !-f
    RewriteCond /var/www/myserver.com/public_html%{REQUEST_FILENAME} !-d
    RewriteRule ^/(.*)$ /archive/$1.
    
    

あなたの答え