web-dev-qa-db-ja.com

htaccessに配置されるルールの順序は重要ですか?

これが単純な「はい」または「いいえ」の答えであることを願っています(理由を明記してください)

Q1:ルールがhtaccessに配置される順序は重要ですか?それらは完全に分離されたアイテムであるため、たとえば、

Q2:はいの場合、htaccesエンジンを高速化し、不必要なルールでオーバーロードしないようにするために、正しい順序を適用していますか?

Q3:ここで無効化/追加するものに関するヒントは、大歓迎です+1!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /
9
Sam

まあ、.htaccessファイルは通常のApache構成ファイルと同じ形式を使用するため、同じルールが適用されます。

ほとんどの構成設定は順序に依存しませんが、一部は依存します-設定に依存します。

RewriteRuleおよびRewriteCond例:順序に敏感なので、その場合の答えはYESです。

たとえば、.

http://wiki.Apache.org/httpd/RewriteRule

これらが評価される順序の説明については。

10
sleske

それは問題である。 RewriteRuleのドキュメント からの引用:

これらのルールが定義される順序は重要です-これは、実行時に適用される順序です。

4
Flimm

たとえば、<files><Rewrite>の順序がパフォーマンスにどのように影響するかについては説明できません。私はそれを自分で見つけようとしています。これに関する情報を見つけることができなかったので、おそらくそれは問題ではありませんか?

ただし、RewriteRedirect(およびRedirectMatch)の間では、実行順序mayが記載されている順序ですが、それは多くの場合、人々が期待するものです。
具体的には、mod_rewriteおよびmod_aliasモジュールは、独立して処理され、実行されますthatの順序。

  1. すべてのmod_rewriteディレクティブ(Rewrite)が(リストされている順に)実行されます。
  2. [〜#〜] then [〜#〜]すべてのmod_aliasディレクティブ(RedirectおよびRedirectMatch)は次の順序で実行されますtheyはファイルにリストされています。

したがって、RedirectRewriteを続行しても、リダイレクトは処理されますafterすべての書き換えが処理されました。

リダイレクトと書き換えの両方がある場合にファイルを「読み取り可能」に保つ1つの方法は、mod_aliasモジュールをまったく使用しないことです。代わりに、mod_rewriteのみを使用してください。 [R]フラグによる書き換えは、本質的にそれを書き換えに変えます。
このウェブマスターの回答 はその方法を示しています。

これで、すべてのディレクティブがファイルに表示される順序で実行されるため、実行順序について厄介な驚きや混乱はありません。または、couldすべてのRedirectおよびRedirectMatchディレクティブをファイルの「下部」に物理的に再配置し、それらが実行されないことを思い出させるとにかくRewritesの後まで。

この時点で啓発されたいくつかの優れたStackExchangeの回答を次に示します。

残りについては、たとえばfilessの前または後にrewriteを置く間のパフォーマンスに関する情報を見つけることができませんでした。私が見つけた唯一のパフォーマンスベースのアドバイスは、サーバー構成ファイルにアクセスできる場合は、できるだけ移動するのが最善であるということですfrom .htaccessファイルto構成ファイル、および.htaccessファイルを完全に無効にします(または.htaccessファイルする必要がありますを読み取る特定のディレクトリを指定します)。

ロジックでは、構成ファイルに配置されたルールは一度だけ読み取る必要があります。 htaccess処理がオンになっている場合、everyリクエストの場合、サーバーのevery(リクエストされたディレクトリ以上)のディレクトリで、htaccessファイルが存在するかどうかを検索する必要があります。存在するかどうか。そして、もしそうなら、一人一人が新たに読まれなければならない。

  • Apache docs は、「。htaccessファイル」セクションの下部でこれについて言及していますが、その理由は説明していません。その方法を調べるには、周囲を調査する必要があります。
  • http://www.apacheweek.com/features/tips 「Apacheセクションをスピードアップする方法」では、whyを視覚的に示しています。
  • Apacheパフォーマンス:.htaccessを無効にする -最初に「.htaccessを無効にし、Apache config内でmod_rewriteを使用する」セクションを読みます。
1
SherylHohman