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


16

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

このページhttp://httpd.apache.org/docs/trunk/mod/core.html#ifを参照しましたが、あまり詳しく説明していません。多くの例を示しています。それが与える2つの不完全な例は次のとおりです。

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

そして

<「$ req {Host} = ''」の場合> 

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

<%{SERVER_PORT}がGET、HEAD、OPTIONSの場合>
   #ここにはまだ何もない
</ If>

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

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

ありがとう!


1
500エラーが発生する場合、Apacheがエラーログに何かを記録していることを意味します。それは何と言っていますか?また、SERVER_PORTinのテストはGET,HEAD,OPTIONS意味がありません(SERVER_PORTリクエストが受信されたポート番号になります)。
ラースク

ありがとう、ラルスク。<If>ディレクティブをサポートしないApache 2.0を実行しているようです。2.3へのアップグレードを検討する必要があるかもしれません。少なくとも、これはどこにも例がない理由を説明しています(b / c機能はとても新しいです)。アドバイスをありがとう。
cwd

回答:



14

<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

1
テストしても動作しません!Apacheのドキュメントでは、<IfDefine>ディレクティブは起動時にのみ解析されparameter-name、コマンドプロンプトを使用して渡すことができるのはhttpd -Dx=y
William Leung

あなたの「Alternatives to If」は私にとってはうまくいきました。良い例です。
-Kyborek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.