web-dev-qa-db-ja.com

Negative RegExを使用したApache HTTP LocationMatchリダイレクト

私のシステムでApache HTTP Serverの mod_aliascore を使用してRedirectを作成しようとしています:

# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.1 (Maipo)
# rpm -q httpd
httpd-2.4.6-31.el7_1.1.x86_64
# 

要件は、/server-statusへのリクエストを除くすべてのリクエストをリダイレクトすることです

# cat /etc/httpd/conf.d/_default.conf 
<VirtualHost *:80>
    ServerName _default_
    <LocationMatch "^/!(server-status)(.*)?">
        Redirect / http://X/
    </LocationMatch>
</VirtualHost>
# 

どのURLをヒットしても404になるので、私の問題は正規表現のどこかにあると思います。

2
alexus

1-mod rewriteを使用してそれを行うことができます https://httpd.Apache.org/docs/2.4/mod/mod_rewrite.html

<VirtualHost *:80>
    ServerName _default_
    RewriteCond %{REQUEST_URI} !^/server-status
    RewriteRule (.*) http://X$1 [L,R=301]
</VirtualHost>

2-Mod_Aliasを使用するには、RedirectMatch http://httpd.Apache.org/docs/current/mod/mod_alias.html が必要です

<VirtualHost *:80>
    ServerName _default_
    RedirectMatch 301 ^/(?!server-status)(.*) http://X/$1
</VirtualHost>

3-詳細:

  • 設定が変更されたら、Apacheを再起動する必要があります
  • サーバーは異なる必要があります。それ以外の場合は、リダイレクトループが発生します。

4-ボーナス

(。*)=正規表現ですべてをキャッチ

$ 1 =結果の変数

R =リダイレクトステータスコード、ここにリストがあります:

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

L =最後に意味するフラグ最後に、ここにフラグリストコードがあります。

https://httpd.Apache.org/docs/2.4/rewrite/flags.html

5-さらに... LocationMatch構文を本当に使用したい場合:

<VirtualHost *:80>
    ServerName _default_
  <LocationMatch "^/(?!server-status)(.*)">
    Redirect / http://X/
  </LocationMatch>
</VirtualHost>
3
Froggiz