Letsencrypt用htaccess

时间:2016-08-05 13:23:54

标签: apache .htaccess mod-rewrite lets-encrypt

这是我目前htaccess配置的/ frontend / web

RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME} [R,L]
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php

我想插入此内容:

RewriteCond %{REQUEST_URI} !^.well-known/acme-challenge/$

RewriteCond %{REQUEST_URI} ! /\.well-known|^\.well-known

上面

RewriteRule ^.*$ https://%{SERVER_NAME} [R,L]

创建letsecnrypt证书,但这些都不起作用。

Letsencrypt命令创建证书(debug coz Centos6):

./letsencrypt-auto --debug certonly --webroot -w /var/www/html/example.com/frontend/web/ --email example@gmail.com --domains example.com

letsencrypt错误:

The following errors were reported by the server:

Domain: example.com
Type:   unauthorized
Detail: Invalid response from
http://example.com/.well-known/acme-challenge/%acme%

上面的链接引导我访问站点协议的HTTPS版本。如果我删除重定向到https,我会收到成功收到证书的消息。结论:.well-known继续发送到https,我的设置不起作用,我做错了什么?

5 个答案:

答案 0 :(得分:4)

只需从您的HTTPS重定向中排除.well-known,否则它应保留位置并永久保留:

RewriteRule ^(?!\.well-known(?:$|/)).* https://%{SERVER_NAME}/$0 [R=301,L]

编辑:在不更改任何规则的情况下,最简单的方法是在所有其他规则之前添加一个单独的规则,有效地禁用目录的重写,如下所示:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^\.well-known/.+ - [END]

文件存在检查是可选的,省略它意味着您的服务器的默认错误响应将显示而不是任何自定义错误页面。

答案 1 :(得分:4)

我最终得到了这个配置,就像cakephp 2的魅力一样:

将此文件放在位于webroot和app文件夹上方的.htaccess文件中,与应用程序位于同一文件夹中

<IfModule mod_rewrite.c>    
  RewriteEngine on

  RewriteRule ^.well-known/ - [L,NC]

  RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
  RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

  RewriteCond %{HTTPS} !=on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

  RewriteRule    ^$ app/webroot/    [L]
  RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

只需更换底部2行即可适合您的系统。

答案 2 :(得分:1)

将其这样放入 .htaccess

RewriteRule "^.well-known/acme-challenge" - [L]

答案 3 :(得分:0)

我通常在我的vhost配置中添加别名,指向不安全的环境。通常我的开发或登台服务器受到htaccess保护,而实时系统(显然)不是。

Apache虚拟主机配置:

protected.example.com.conf

<VirtualHost *:80>
    Alias /.well-known /var/www/example.com/.well-known
    <Directory /var/www/example.com/.well-known>
        Require all granted
    </Directory>
</VirtualHost>

当然,您还需要调整letsencrypt cmd。它应该指向别名目标。

./letsencrypt-auto --debug certonly --webroot -w /var/www/example.com/.well-known --email example@gmail.com --domains example.com

答案 4 :(得分:0)

这对我有用:

RewriteCond %{REQUEST_URI} !^/.well-known/(.*)