在LocationMatch指令中使用否定

时间:2009-01-12 16:23:06

标签: apache2

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

所以标准是:

  1. 拥有旧证书的用户可以 访问完整网站
  2. 拥有新证书的用户只能访问/ jira网址格式
  3. 我尝试了几个组合,但无法得到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>
    

5 个答案:

答案 0 :(得分:13)

apache 2.2不支持负正则表达式

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

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

作为解决方法,请使用:

<LocationMatch "/[^s][^t][^a][^t][^i][^c]">
</LocationMatch>

<LocationMatch "^/(?!static)">
</LocationMatch>

答案 1 :(得分:3)

试试这个:(感谢米洛斯的提示)

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>

答案 2 :(得分:2)

Apache2使用pcre支持perl5 RE语法,这可以使用http://perldoc.perl.org/perlre.html#Extended-Patterns中描述的负面预测。

答案 3 :(得分:2)

这可能是一个方便的,使隐藏所有隐藏的文件/目录(保护.git,.htaccess等...)仍然允许访问/.well-known/ 可以安装在任何apache 2.4 virtualhost中或直接安装在apache2.conf中

因为我需要这个并且无法找到现成的解决方案,所以就在这里。 希望它有所帮助。

<LocationMatch "^/(?!\.well-known/)">
    RedirectMatch 404 ^(.*/)?\.
</LocationMatch>

答案 4 :(得分: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>