web-dev-qa-db-ja.com

.htaccessで<If>ディレクティブをどのように使用すればよいですか?

.htaccessファイルにApacheのIfディレクティブを使用して条件ステートメントを追加しようとしています。

私はこのページを参照しました http://httpd.Apache.org/docs/trunk/mod/core.html#if ですが、詳しくは説明していません/多くの例を示しています。以下の2つの不完全な例を示します。

 <%{REQUEST_METHOD} IN GET、HEAD、OPTIONSの場合> 

そして

 <If "$ req {Host} = ''"> 

だから私はこれを私の.htaccessファイルに追加しようとしました:

 <If%{SERVER_PORT} IN GET、HEAD、OPTIONS> 
 #nothing here here 
 </ If> 

しかし、ページをロードしようとすると、Error 500が発生し続けます。これは私のローカルインストールにあり、以前は正常に機能していました(またはそのコードを削除した場合)。私はAllowOverride Allグローバルに設定し、Ifディレクティブのコンテキストで.htaccessに存在させる必要があります(「コンテキスト:サーバー構成、仮想ホスト、ディレクトリ、.htaccess」)。

<If>ディレクティブを適切に使用する方法の例や、なぜ機能しないのかについてのガイダンスを誰かに教えてもらえますか?

ありがとう!

16
cwd

<If>ディレクティブはApache 2.4以降でのみ使用でき、2.2以前では使用できません。

http://httpd.Apache.org/docs/2.4/mod/core.html#if

2.2に存在しないドキュメント:

http://httpd.Apache.org/docs/2.2/mod/core.html#if

16
tgriesser

<If>はApache 2.4以降でのみ使用できるため、まずそのバージョンを使用していることを確認してください。

# Compare the Host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_Host} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_Host} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If>の代替

それでも行き詰まっている場合に、Apache 2.2で条件付きステートメントを実行するためのソリューションは他にもいくつかあります。

  • 次の方法で環境変数を設定できます。

    • Apacheの設定
    • SetEnvIf
    • mod_rewriteのRewriteMatch
  • 次に、次を使用して条件ステートメントを実行できます

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

例:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
16
Simon East