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


11

我在一个虚拟主机上进行了以下设置:

...<VirtualHost *:80>
    ServerName cloud.domain.de
    ServerAdmin webmaster@domain.de
    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不被重写?

Answers:


16

像那样 :

<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/则请求将不会重定向


首先,谢谢您的建议!不幸的是,它没有用。当您访问时:http://www.server-plant.de/.well-known/acme-challenge/它仍在被重写。(我为www-Subdomain应用了相同的Rewrrite规则和条件,因此与cloud-Subdomain
完全相同

编辑:有()而不是{},RewriteCond %{HTTPS} off并且不需要
Froggiz

是的,我只是盲目地复制了您的,而没有检查右边的括号,但是,发生.. :)现在它就像魅力一样工作,并且您在其他情况上也很正确。剩下的一个问题是:如何更改条件以匹配尾随的所有内容/?因此它不会捕获index.html等吗?
FleBeling

它已经匹配所有start with /.well-known/acme-challenge/意味着 /.well-known/acme-challenge/anything不会再重定向的内容
Froggiz

1
RewriteOptions InheritDown从Apache 2.4.8开始,重写配置可以继承到所有虚拟主机。RewriteEngine On每个虚拟主机配置中仍然存在。
tobltobs

3

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

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

添加它以停止下面的ssl重定向规则真是太棒了
James Tan

第2行中的单个点对我不起作用。是因为它只匹配一个字符,而URL却包含几个字符?我改用^(。*)$。
杰特(Jette)

0

恕我直言,更短更强大:

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

您可能最终希望添加/ acme-challenge /,但是如果您想使用任意文件调试它,例如./well-known/test,则此解决方案效果更好

它实际上是做什么的:查看请求是否以.well开头,在这种情况下什么也不做(-的含义)并将其作为最后一条规则[L]


不。虚拟主机似乎仍然具有优先权。“ <VirtualHost>部分中的部分在虚拟主机定义之外的相应部分之后应用。这使虚拟主机可以覆盖主服务器配置。” 摘自httpd.apache.org/docs/current/sections.html
Frederick Nord
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.