【发布时间】:2018-03-02 04:16:06
【问题描述】:
我正在尝试让 LetsEncrypt autoSSL 爬虫在我的 htaccess 上工作,它正在实现白名单方法。
爬虫可以成功验证我的域,因为它可以访问:
$ curl -i http://example.com/.well-known/acme-challenge/BEKT19DL9JIG9S5GPP50XAL9ZSPAV54J
HTTP/1.1 200 OK
因为我的实现:(1)
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^\/[A-F0-9]{32}.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^\/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} /\.well\-known\/acme\-challenge
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.*) - [L]
</IfModule>
我有这条规则将www 站点版本重定向到non-www 版本:(2)
# Rewrite "www.example.com -> example.com"
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
因此,为了处理爬虫尝试验证域的www 而没有获得 301 重定向,我实现了以下 htaccess 规则:(3)
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteCond %{REQUEST_URI} ^\/[A-F0-9]{32}.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^\/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} /\.well\-known\/acme\-challenge
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.*) - [L]
</IfModule>
但是,爬虫在尝试验证 www 版本时得到 301 permanent redirect
$ curl -i http://www.example.com/.well-known/acme-challenge/BEKT19DL9JIG9S5GPP50XAL9ZSPAV54J
HTTP/1.1 301 Moved Permanently
我不明白为什么 (2) htaccess 规则仍然导致爬虫获取301 redirect,我的 (3) 规则有问题吗?
总结一下,我的问题是:
允许访问隐藏目录:/.well-known/acme-challenge/(仅当它是现有文件时)
如果通过
www版本访问它,请不要重定向和提供文件(使 HTTP/1.1 状态代码为 200)
希望有人可以提供帮助。
问候,
【问题讨论】:
-
我无法判断您最终的 .htaccess 重写规则是什么样的,它们是您发布的三个规则的组合还是只是第三个规则的组合。要检查的一件事是重写规则的顺序。如果 www RewriteRule 是第一个,因为它匹配所有模式,所有请求都会得到 301 重定向,然后检查它是否匹配其他 RewriteRule。您还应该查看您对重写标志的使用,如果匹配,带有 L 标志的 RewriteRule 将停止处理其他规则。
-
@GracefulRestart 我已更新我的帖子以包含我拥有的完整 htaccess。它是 3 的组合,首先设置了
acme-challenge规则,为什么它仍然被重定向:(