在LocationMatch指令中使用否定

12 apache2

我们的站点在apache上运行,并使用客户端证书进行保护.到目前为止,只有一个证书可以访问整个站点.现在,我们要求将jira公开给一组新用户,这些用户除了jira之外不应该访问任何其他内容.我为该组创建了一个单独的证书,并计划通过使用SSLRequire和Location/LocationMatch组合来区分它们.

所以标准是:

  1. 拥有旧证书的用户可以访问完整的站点
  2. 拥有新证书的用户只能访问/ jira URL模式

我尝试了几个组合,但无法得到LocationMatch工作的否定.任何帮助,将不胜感激.

httpd.conf文件如下所示:

SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /etc/apache2/ssl/myca.crt

<Location /jira> 
   SSLRequire   %{SSL_CLIENT_S_DN_CN} in {"AllUsers", "JiraUsers"}
</Location> 

<LocationMatch /!(jira)> 
   SSLRequire   %{SSL_CLIENT_S_DN_CN} eq "AllUsers"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

小智 13

apache 2.2不支持负正则表达式

请参阅https://issues.apache.org/bugzilla/show_bug.cgi?id=10932

我不知道它是否已在最后一个apache版本中修复.

作为解决方法,使用:

<LocationMatch "/[^s][^t][^a][^t][^i][^c]">
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

要么

<LocationMatch "^/(?!static)">
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

  • / [^ s] [^ t] [^ a] [^ t] [^ i] [^ c] /仅匹配6个字符长的位置. (3认同)

小智 1

这是一个让正则表达式正确的问题。具有以下正则表达式的 LocationMatch 指令运行良好。

SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /etc/apache2/ssl/myca.crt

<Location /jira> 
   SSLRequire   %{SSL_CLIENT_S_DN_CN} in {"AllUsers", "JiraUsers"}
</Location> 

<LocationMatch ^/[a-ik-zA-IK-Z]> 
   SSLRequire   %{SSL_CLIENT_S_DN_CN} eq "AllUsers"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)