![apache2.4 mod_rewrite 排除特定别名 directroy/uri](https://linux22.com/image/671834/apache2.4%20mod_rewrite%20%E6%8E%92%E9%99%A4%E7%89%B9%E5%AE%9A%E5%88%AB%E5%90%8D%20directroy%2Furi.png)
我的一个虚拟主机上有以下设置:
...<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]