すべての仮想ホストに適用されるグローバルなRewriteCond / RewriteRuleをApacheに実装するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/344588

  •  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 ..ひどく簡潔な 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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top