2017-10-10 6 views
1

.htaccessに1つのドメインを除くすべてのトラフィックをhttpsにリダイレクトする書き換えルールを書き込もうとしています。次に、移動先のファイルが存在しない場合は、最後のブロックを実行してloader.phpに移動しますが、ファイルが存在する場合は移動します。ファイルが存在する場合はhtaccessルールを書き直してください。PHPファイル

は、ここで私がこれまで持っているの反復の一つです:ユーザーがkorlett.orgまたはkorlett.netまたはkorelett.comまたは内の任意のファイルになっている場合

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 
<If "-f %{DOCUMENT_ROOT} . '/'"> 
    RewriteEngine On 
    RewriteBase/
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^.*$ /loader.php [L] 
</If> 
<Else> 
    RewriteEngine On 
    RewriteRule^/404.html [R=404,L] 
</Else> 

私は何をしようとしていることで、それはhttps://にリダイレクトします。しかし、http://korle.ttまたはこのディレクトリを指す他のドメイン(現在は指定されていません)では、HTTPのままです。ファイルが存在しない場合、またはURLが404を返す場合

その後、その後、これを実行します。

RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ /loader.php [L] 
長いがあるかどうかを確認するためにloader.phpするためにそれを送られていない場合は、その後
+1

「If」は何ですか?通常、あなたはそれなしでこれを行います。 – tadman

+0

@tadman私はそうだと思っていましたが、ファイルが404/not foundを返すかどうかを調べるよう勧めてくれました。しかし、ファイルを検証しようとすると、これは有効な構文ではない(Ifの場合)。だから私はそれが動作するかどうかは関係ありませんね。助言がありますか? – wordSmith

+1

'RewriteCond'ディレクティブは'それ 'の一種です。他のものはちょうどここに来ています。 – tadman

答えて

1

そのフラグメント/ "dir"とurlペアを作成し、失敗した場合は404ページを提供します。

この404応答はloader.phpで管理する必要があります。あなたのPHPスクリプトで。リクエストがloader.php(ファイルまたはディレクトリにマップされていないリクエスト)に渡されると、.htaccessがリクエストを処理し終え、Apacheに404レスポンスを処理させることができなくなります。

loader.phpが

が見つからない場合はしかし、これは確かにErrorDocumentを設定し、RewriteRule置換のスラッシュプレフィックスを除去することで、.htaccessに管理することができ 404にサービスを提供すべきです(あなたはRewriteBase指示文を含んでいるので、とにかく意図していたはずです)。スラッシュ接頭辞を削除すると、リライトループ(繰り返し書き換えがloader.php)になります。これに代えて他の言葉で:正規表現^(この例では^.*$と同じ最終結果を有しており、単にと一致するように働く

RewriteRule^loader.php [L] 

RewriteRule ^.*$ /loader.php [L] 

なお、このなければなりませんあなたのHTTPからHTTPSへのリダイレクトのように)。

loader.php(相対パス、スラッシュプレフィックスなし)に書き換えると、書き換えエンジンは同じURLに書き換えていることを検出し、それ以上の書き換えを防止するため、書き換えループを防止します。 Apache 404 ErrorDocumentの配信を許可する。 (/loader.phpは技術的に異なるURLですが、mod_rewriteに関する限り、書き換えは続行されます。)

だから、あなたの完全な.htaccessファイルは次のようになります。

ErrorDocument 404 /404.html 

RewriteEngine on 
RewriteBase/

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} !^(www\.)?(korle\.tt) [NC] 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 

リライトループを防止するための別の方法はloader.phpのための特定の例外を含めることです。実際には、書き換えエンジンが変更を検出するのを待つのではなく、書き換えが早く失敗するように、これを上記と一緒に使用することができます。たとえば、上記の最後のブロックを次のように変更してください。

RewriteRule ^loader\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^loader.php [L] 
+0

'ErrorDocument 404'は決して呼び出されません。 – anubhava

+1

@anubhava 'ErrorDocument 404'は、' loader.php'自体が存在しない場合のみです。書き換えループを回避するための対策を講じると、このシナリオでカスタムエラードキュメントが表示されるようになります。 (これらのディレクティブは、 'loader.php'が存在しない場合には間違いなく削除されるべきですが、' .htaccess'ファイルを編集する必要はありませんか?) – MrWhite

関連する問題