【问题标题】:Redirect `www` to `non-www` EXCEPT if its LetsEncrypt verification将 `www` 重定向到 `non-www` 除非它的 LetsEncrypt 验证
【发布时间】: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 规则,为什么它仍然被重定向:(

标签: .htaccess redirect


【解决方案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 版本而有所不同)。

【讨论】:

  • 实际上,我刚刚了解到我应该将 (1) 规则置于其他任何事情之上以使其发挥作用。但是干得好;)
猜你喜欢
  • 2012-06-09
  • 2013-09-03
  • 2019-10-26
  • 2018-07-03
  • 2017-01-11
  • 2016-10-14
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多