apache2.4 mod_rewrite 排除特定别名 directroy/uri

apache2.4 mod_rewrite 排除特定别名 directroy/uri

我的一个虚拟主机上有以下设置:

...<VirtualHost *:80>
    ServerName cloud.domain.de
    ServerAdmin [email protected]
    ServerSignature Off

    Alias "/.well-known/acme-challenge" "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge"

    <Directory "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge">
      Require all granted
      ForceType 'text/plain'
    </Directory>

    <ifmodule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %(REQUEST_URI) !/\.well\-known/acme\-challenge/?.*
      RewriteCond %{HTTPS} off
      # RewriteRule ^\.well-known/acme-challenge/([A-Za-z0-9-]+)/?$ - [L]
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    </ifmodule>...

http://cloud.domain.de/.well-known/acme-challenge/我想要实现的是,当访问url 时,mod_rewrite 不会重写 URL 。

我已经尝试了不同的方法,其中之一就是上面注释掉的 RewriteRule,但似乎没有任何效果:服务器每次都会将其重写为 https。

当我为了测试目的禁用重写时,我可以正常访问别名 URL...

如何实现特定的URL不被重写?

答案1

像那样 :

<ifmodule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</ifmodule>

如果 URI 匹配,start with /.well-known/acme-challenge/则请求不会被重定向

答案2

@mark“更短更强大”变体的正确版本:

RewriteCond %{REQUEST_URI} ^/\.well\-known
RewriteRule . - [L]

答案3

我认为更简短、更强大:

RewriteCond %{REQUEST_URI} ^\.well\-known
RewriteRule - [L]

您可能最终想要添加 /acme-challenge/,但如果您想使用任意文件(如 ./well-known/test)进行调试,此解决方案效果更好

它实际上做了什么:查看请求是否以 .well-known 开头,如果是,则不执行任何操作(- 的含义),并将其作为最后一条规则 [L]

相关内容