2017-06-01 8 views
2

私はApache Webサーバーを借りています。フォルダのアーキテクチャは、このようなものです:index.phpとフォルダへのリダイレクトとの衝突

  • ルート
    • SRC
    • テンプレート
    • 以下
    • WWW
      • CSS
      • JS
      • JPEG

ウェブサーバーにのみwwwディレクトリを提供しています。また、.htaccessを使用してHTTPSにリダイレクトし、www.を削除して、index.phpにすべてのリクエストをリダイレクトします(ただし、ファイルはwwwフォルダに存在します)。

RewriteEngine On 

# Redirect to HTTPS 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# Remove WWW 
RewriteCond %{HTTP_HOST} ^www\.domaine\.com$ [NC] 
RewriteRule (.*) https://domaine.com%{REQUEST_URI} [R=301,QSA,NC,L] 

# Redirect all route to index.php 
# Except the files 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) /index.php?$1/ [NC,L,QSA] 

問題は、フォルダ名を要求するときです。フォルダはindex.phpに2回リダイレクトされます。

例:http://domaine.com/cssをリクエストすると、リクエストはhttps://domaine.com/index.php?css/?css/にリダイレクトされます。

どのようにダブルリダイレクトを解決するには?あなたの最後のルールからディレクトリを除外したり、この動作

を避けるために、ディレクトリへのリダイレクトルールを使用して、末尾にスラッシュを追加するか必要

+0

ブラウザのキャッシュを消去してみてください。 – starkeen

答えて

1

は、そうでない場合は、最後のルールは/index.phpにスラッシュのないディレクトリを書き換え、欠落によりスラッシュmod_dirモジュールリダイレクトへ末尾にスラッシュを付けてください。 回避の複数の301からhttp->httpsルールがhttp://www.domaine.com/ある要求に対してをリダイレクトする前に

また、あなたはwwwルールを移動する必要があります。

<IfModule mod_negotiation.c> 
    Options -MultiViews 
</IfModule> 
Options -Indexes 
RewriteEngine On 

# Remove WWW and use https 
RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC] 
RewriteRule^https://%1%{REQUEST_URI} [R=301,NE,L] 

# Redirect to HTTPS 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] 

# add trailing slash for directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301] 

# Redirect all route to index.php 
# Except the files 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* index.php?$0/ [NC,L,QSA] 

この変更をテストする前に、必ずブラウザのキャッシュをクリアしてください。

+0

私は訪問者が私のサブディレクトリにアクセスすることを許可したくありません。ファイルにのみ – olive007

+0

'サブディレクトリ 'のコンテンツはこれらのルールでリストされず、' DirectorySlash Off'はセキュリティリスクです。 Apacheのマニュアルを読んでください。この問題を処理するより良い方法があります。 – anubhava

+0

セキュリティのリスクを避けるために、Apacheのドキュメントを読んでインデックスオプションを無効にしました。私のサーバーにはそれがない場合でも。ファイルではないすべてのルートをindex.phpにリダイレクトするので、 – olive007

0

解決しました。 DirectorySlashディレクティブで最後に自動スラッシュを削除します。今はそれが仕事で、私のディレクトリはすべて隠されています。ファイルのみが表示されます。

<IfModule mod_negotiation.c> 
    Options -MultiViews 
</IfModule> 
Options -Indexes 
DirectorySlash Off 
RewriteEngine On 

# Remove WWW and use https 
RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC] 
RewriteRule^https://%1%{REQUEST_URI} [R=301,NE,L] 

# Redirect to HTTPS 
RewriteCond %{HTTPS} off 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* /index.php?$0 [NC,L,QSA]