我试图让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>
但是,当试图验证301 permanent redirect
版本时,爬虫正在获取www
。
$ curl -i http://www.example.com/.well-known/acme-challenge/BEKT19DL9JIG9S5GPP50XAL9ZSPAV54J
HTTP/1.1 301 Moved Permanently
我不明白为什么(2) htaccess规则仍然导致爬虫获得301 redirect
,我的(3)规则有什么问题吗?
总之,我的问题是:
www
版本访问它,不要重定向和服务文件(生成HTTP1.1状态代码200)希望有人能帮忙。
致以敬意,
发布于 2018-03-01 20:16:06
我仍然不确定发生了什么,但规则(1)和(3)似乎是同一个RewriteRule,有一个不同的RewriteCond,这似乎实际上并没有重写任何东西。我也不确定在同一个htaccess文件中使用多个检查的确切行为。
此时,最简单的故障排除方法是简化重写规则,以帮助识别正在发生的事情。
如果不进行实际测试,我的简化重写规则可能会像这样(我还清理了一些我认为不需要的反斜杠,但我可能错了):
<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]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
同样,在不进行测试的情况下,我将其理解为:所有请求模式都应该匹配这两个规则,但是规则每个都有最后一个标记,因此处理应该在匹配时停止。在不进行任何重写的规则中,如果%{HTTP_HOST}以www开头,并且存在三个链接中的一个(使用OR标志而不是隐式和),并且是一个现有文件,则不要重写和停止处理重写规则。如果请求不符合任何这些条件,则将处理第二个RewriteRule,如果%{HTTP_HOST}以www开头,且连接不是HTTPS,则使用301重定向重写http://%1%{REQUEST_URI}并停止处理重写规则。
如果所有这些都不起作用,而且您仍然不知道Apache在做什么,那么现在是启用RewriteRule调试日志的时候了(根据您使用的Apache版本的不同,说明将有所不同)。
https://stackoverflow.com/questions/49041578
复制相似问题