如果它的LetsEncrypt验证

时间:2018-03-01 02:11:14

标签: .htaccess redirect

我正在尝试让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)规则是否有问题?

总结一下,我的问题是:

  • 允许访问隐藏目录:/。well-known / acme-challenge =(仅当它是现有文件时)

  • 如果通过www版本访问它,请不要重定向并提供文件(使HTTP / 1.1状态代码为200)

希望有人可以提供帮助。

此致

1 个答案:

答案 0 :(得分:1)

我仍然不确定发生了什么,但似乎规则(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>

同样,在没有测试的情况下,我将其读作:所有请求模式都应该匹配两个规则,但每个规则都有LAST标志,因此处理应该在匹配时停止。在没有任何重写的规则中,如果%{HTTP_HOST}以www开头,并且存在三个链接之一(使用OR标志而不​​是隐式AND)并且是现有文件,则不要重写并停止处理重写规则。如果请求与这些条件中的任何一个都不匹配,那么将处理第二个RewriteRule,如果%{HTTP_HOST}以www开头并且连接不是HTTPS,则使用301重定向重写为http://%1% {REQUEST_URI}并且停止处理重写规则。

如果这些都不起作用且您仍无法确定Apache正在做什么,那么就应该启用RewriteRule调试日志(说明将根据您使用的Apache版本而有所不同)。