Apache HTTP LocationMatch 使用负正则表达式重定向

Apache HTTP LocationMatch 使用负正则表达式重定向

我正在尝试创建一个Redirect使用 Apache HTTP Server 的mod_alias在我的系统上:

# 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。

答案1

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>

相关内容