2017-05-17 9 views
1

フォルダー内に末尾のスラッシュを付けたいのですが、ファイル内に後ろにスラッシュを入れたくありません。可能性のある重複を避ける方法が必要です。後続のスラッシュを強制します。処理オーバーヘッド?

私はその答えを見つけました: Htaccess: add/remove trailing slash from URL

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301] 

私は私の.htaccessにしようと、うまく

を動作しているようです。しかし、私は同様のコードは、「処理のオーバーヘッドを引き起こす可能性があることをApacheのドキュメントに記載されてい「

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

私は異議を理解していれば、私は知りません。それはあまりにもそのコードに適用されていますか? .htaccessにそれを入れて、必要なときに右のスラッシュを強制するのは良い習慣ですか?それを行う最良の方法は何ですか?

答えて

2

私は私の.htaccessにしようと、それが

非常によく

に動作しますよろしいですか? (あなたの特定のケースではうまくいくでしょうか?)しかし、あなたはそれらの2つのルールブロックを一緒に使うべきではありません。最初のものは末尾のスラッシュ(ディレクトリ以外のもの)を削除し、2番目のルールはスラッシュ(ファイル以外のもの)を追加します。

たとえば、/foo/の要求を行った場合、/fooはディレクトリもファイルにもマッピングされません。リダイレクトループが発生します。最後のスラッシュはその後などなど、追加、削除され

その力に

まあ、実際には、これらのルールのいずれも、」軍が最後のスラッシュをフォルダにスラッシュを末尾やファイルにスラッシュを末尾ありませんフォルダ "を選択します。 DirectorySlash On(デフォルト)を指定すると、mod_dirは(301リダイレクトを使用して)ディレクトリーにスラッシュを強制します。

は、「処理のオーバーヘッド」

を引き起こす可能性がオーバーヘッドを処理(つまりRewriteRuleパターンに一致する)すべての要求上のディレクトリおよび/またはファイルの存在を確認しています。はい、これはオーバーヘッドですが、オーバーヘッドが進むにつれて、それは限界的とみなされます。ほとんどのCMSでは、フロントコントローラーで同様の手法を使用しています。たとえば、

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

ただし、これは最適化できます。静的リソース(画像、CSS、JSなど)のように見えるようにファイルの先頭に例外を含めることができ、これらの要求のディレクトリ/ファイルチェックを防止できます。たとえば、次のように

RewriteRule .\.(jpe?g|png|gif|css|js)$ - [L] 

これは、単にそれらのファイル拡張子で終わるすべてのリクエストをチェックし、さらに処理を停止するため、何のディレクトリ/ファイルのチェックがこれらの要求に対して実行されません。

別に
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301] 

(念のために、これはあなたの実際のコードである。)Apacheは、実際に行末のコメントをサポートしていません。この場合、 "うまくいく"が、将来の編集はひどくひどく壊れてしまうので、避けてください。私はフォルダにスラッシュを末尾やファイルにスラッシュを末尾のない強制したいhttps://stackoverflow.com/a/31770372/369434


:この他の質問に対する私の答えを参照してください。

UPDATE:私は、我々は唯一の物理的なファイルやディレクトリを扱っていると仮定しは、何仮想 URLがフロントコントローラでルーティングされていないされているなど

その場合、あなたは何をする必要はありません何でもディレクトリに末尾にスラッシュを入れてください。(上記のように)。 DirectorySlash Offでない場合は、に設定されています。これにより、末尾にスラッシュがないディレクトリを要求するときに、mod_dirが(301リダイレクトを介して)後続のスラッシュを自動的に追加することができます。 (あなたが掲示二番目のルールは同じことを行いますが、のmod_dirはそのことをやっている場合は不必要である。)

、あなたはあなたが投稿し2のちょうど最初のルールが必要になるファイルから末尾のスラッシュを削除するには:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [R,L] 

これは、要求に存在し、物理ディレクトリの要求ではない場合、末尾のスラッシュを削除します。これをさらに最適化することは困難です。このルールは、最初に末尾にスラッシュがある場合にのみ処理されるため、キャッチされるリクエストの数は最小限に抑える必要があります。ただし、アプリケーションの標準(非末尾のスラッシュ)URLにすでにリンクしていることが重要です。

静的リソースを除外する上記の最適化はオプションです。 .htaccessファイルに他のmod_rewriteディレクティブがない場合は、メリットはほとんどありません。

+1

非常によく説明された回答++ – anubhava

+0

ありがとうございました。私は私の質問を更新しました。コードは私に必要なものではないようです。フォルダの後続スラッシュとファイルの後続スラッシュを強制する最良の方法を提案できますか?可能性のある重複を避ける方法を探しています – Nrc

+0

私は私の答えを更新しました。 – MrWhite

関連する問題