web-dev-qa-db-ja.com

.htaccess内の単一のRewriteCondに対する複数のRewriteRules

.htaccessに次のコマンドがあります

    RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
    RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
    RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]

%2は2行目以降で機能していません。 %2の変数を定義して、すべてのRewriteRuleコマンドで使用できますか?次のコマンドは動作します

     RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
     RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
     RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]

ただし、条件を複製せずに複数のルール行に%2を使用します。

44
Huseyin

変数はApache varとして保存する必要があり、条件を繰り返すことなく使用できます。

Apache変数の保存は、2行目に示されています。 3行目と4行目の保存された変数の使用。

RewriteCond %{HTTP_Host} ^(www\.)?([a-z0-9-]+)\.example\.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L]
31
Huseyin

RewriteRuleフラグを使用できますS|skip複数のRewriteRulesを単一のRewriteCond(またはRewriteCondsのセット)に結び付けるため。 1つのCondを3つのルールに適用する例を次に示します。

RewriteCond  %{HTTP_Host}  !^www.mydomain.com$
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule  .?  -  [S=3]
RewriteRule  ^path1(/.*)$  /otherpath1$1
RewriteRule  ^path2(/.*)$  /otherpath2$1
RewriteRule  ^path3(/.*)$  /otherpath3$1

既存のCondを複数のルールで機能するように変更するには、以下を行う必要があります。

  • 条件を無効にします(先頭に!)
  • 複数のRewriteCondsがある場合:
    Condsの論理ANDをORに、またはその逆に変更します。
  • 条件に関連付けるすべてのルールの前に、スキップ書き換えルールを追加します。 Sパラメーターをスキップするルール行の数に設定します。

スキップされたルールでRewriteCond(%1など)を指す後方参照を使用することはできないことに注意してください。これらは、スキップするRewriteRuleでのみアクセス可能です。

58
Jpsy

明らかに、これはあまり面白くありません。特に物事が成長し、より複雑になるにつれて。ただし、RewriteRuleステートメントにはあまり知られていないオプションがあり、次のN個のRewriteRuleステートメントをスキップするようApacheに指示します。 [S = N]。そのため、リクエストがファイルではなくディレクトリでもない場合に毎回チェックする代わりに、次のようにします。

#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=3]
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L]

私はこれを以下から見つけました: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

役に立つと思う

7
Hoàng Vũ Tgtt

Apache 2.4から、<If>ディレクティブを使用できます。

RewriteEngine On
<If "%{HTTP:Upgrade} == 'websocket'">
    RewriteRule /nidoran/(.*)           ws://localhost:8080/nidoran/$1 [P,L]
    RewriteRule /kakuna/(.*)           ws://localhost:8081/kakuna/$1 [P,L]
    RewriteRule /porygon/(.*)           ws://localhost:8082/porygon/$1 [P,L]
</If>

http://httpd.Apache.org/docs/2.4/expr.html#examples

3
Juan Calero