すべての仮想ホストに適用されるグローバルなRewriteCond / RewriteRuleをApacheに実装するにはどうすればよいですか?
-
19-08-2019 - |
質問
タイトルはほとんどすべてを物語っています。 :-)私はたくさんの仮想ホストを持っているので、リクエストがどの仮想ホストに向けられたとしてもURLを書き換える単一の書き換えブロックをhttpd.confファイルの先頭に置きたいです。どうやってこれを行うのですか?
これを見つけましたが、私の質問は同じです。 .htaccessファイルに頼って、各仮想ホストに対して他のアクションを実行しますか?
OMGTIA!
解決
親スコープ(httpd.confなど)でRewriteOptions InheritDown
を指定して、子仮想ホストにルールを変更せずに適用します。
これは、RewriteEngine
ディレクティブがon
に設定されている仮想ホストでのみ機能します:
書き換え構成は仮想ホストに継承されないことに注意してください。これは、書き換えルールを使用する仮想ホストごとにRewriteEngine onディレクティブが必要であることを意味します。
(ソース)
Apacheは2.4.8以降でこれをサポートしています(元の質問の時点では利用できません)。
RewriteOptions
のドキュメントから:
InheritDown
このオプションを有効にすると、すべての子構成が現在の構成の構成を継承します。すべての子構成でRewriteOptions Inheritを指定することと同じです。親子関係の処理方法の詳細については、継承オプションを参照してください。 Apache HTTPサーバー2.4.8以降で使用可能。
InheritDownBefore
上記のInheritDownと同様ですが、現在のスコープのルールは、子のスコープで指定されたルールの前に適用されます。 Apache HTTPサーバー2.4.8以降で使用可能。
継承を無視
このオプションは、InheritDownまたはInheritDownBeforeを指定する親から継承されるすべてのルールを現在の構成と子の構成に無視させます。 Apache HTTPサーバー2.4.8以降で使用可能。
( http://httpd.apache.org/docs/ current / mod / mod_rewrite.html#rewriteoptions )
他のヒント
デフォルトでは、メインサーバーコンテキストのmod_rewrite構成設定は仮想ホストに継承されません。メインサーバーの設定を仮想ホストに適用するには、各<VirtualHost>
セクションに次のディレクティブを配置する必要があります。
RewriteEngine On
RewriteOptions Inherit
クリック http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html 詳細情報を見つける
追加するのが最も簡単な解決策のように見えます
RewriteOptions inherit
各VirtualHostディレクティブ。これは、少なくとも.htaccessファイルをいじるよりもずっと簡単です。 Apacheは、
デフォルトでは、書き換え構成は 継承されません。これは、あなたが RewriteEngineをオンにする必要があります の各仮想ホストのディレクティブ あなたはそれを使用したい。 ( http://httpd.apache.org/docs/1.3/mod/mod_rewrite。 html )
そしてどうやらデフォルトを変更する方法は、子(vhostまたはdirector)のRewriteOptions経由であるため、各子で何かを行う必要があります。
一度もテストしたことがないため、動作しない可能性がありますが、すべての仮想ホストブロックにinclude
ディレクティブを1つのファイルに追加してみます。各仮想ホスト構成ブロックを一度変更する必要がありますが、その後、変更を行う中心的な場所が必要です。 YMMV。
名前のドメイン部分で何かを書き直そうとしている場合、例えば一般的なスペルミスを修正するには、「継承」オプションさえ必要ありません。名前のない仮想ホストを設定して、無効なホスト名をすべてキャッチし、リダイレクトする前にそれらを正しく再スペルします。
これはリダイレクトを使用するため、書き換えが適用された後に適切な仮想ホストが見つかります。
Options +Indexes +FollowSymLinks
RewriteEngine on
# If it begins with only domain.com, prepend www and send to www.domain.com
RewriteCond %{HTTP_HOST} ^domain [NC]
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301]
# Correct misspelling in the domain name, applies to any VirtualHost in the domain
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC]
RewriteRule ^(.*) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301]
# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them
<VirtualHost *>
RewriteEngine on
RewriteOptions inherit
</VirtualHost>
常に<!> quot; catch-all <!> quot;を使用しました。私が全面的に欲しかったディレクティブのVHost、たとえば......
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ErrorLog "/var/log/apache2/error_log"
</VirtualHost>
<VirtualHost *:80>
ServerName alloftherestoftheVHosts.com
DocumentRoot "/ServiceData/.........
............
そして、動作するのは常にらしい ...エラーログが適切に結合されている、など......しかし、これは以前/競合/同様の結果である可能性があります-マインドディレクティブ。
個人ノート.. Apacheの構成スキーマと構文を思い描いた人は誰でも、ディンバット、または洞窟であまりにも多くの時間を費やしたディンバットのグループでした。または何か!両者は大きく異なりますが... Cherokee のHello-Kittyセットアッププロセスa> ..ひどく簡潔な NGinx config ....は、どちらもはるかに論理的です。.
InheritDownBeforeを使用して、vhostに迷惑メールを追加する必要を避けることができます。
グローバルなletencryptエイリアスの例:
# letsencrypt
<IfModule alias_module>
Alias /.well-known/ /var/www/html/.well-known/
</IfModule>
<IfModule mod_rewrite.c>
# prevent vhost rewrites from killing the alias
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L,PT]
</IfModule>
次に、他のディレクティブなしで、各vhostでこれを実行できます。
<VirtualHost *:80>
....
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/.* /index.php [L,PT]
</IfModule>
</VirtualHost>