これは/ frontend/webの現在のhtaccess設定です
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 [email protected] --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に送信されますが、設定が機能しませんでした。何が間違っているのでしょうか。
HTTPSリダイレクトから.well-known
を除外するだけです。そうしないと、場所が保持され、永続的になります。
RewriteRule ^(?!\.well-known(?:$|/)).* https://%{SERVER_NAME}/$0 [R=301,L]
編集:ルールを変更せずにこれを行う最もクリーンな方法は、次のように、ディレクトリの書き換えを効果的に無効にする別のルールを他のすべての前に追加することです。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^\.well-known/.+ - [END]
ファイルの存在チェックはオプションであり、それを省略すると、カスタムエラーページではなく、サーバーのデフォルトのエラー応答が表示されます。
私は最終的にこの構成になり、cakephp2の魅力のように機能しました。
これを、アプリと同じフォルダー内の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行を置き換えるだけです。
このように。htaccessに入れてください:
RewriteRule "^.well-known/acme-challenge" - [L]
私は通常、セキュリティで保護されていない環境を指すエイリアスを仮想ホスト構成に追加します。多くの場合、私の開発サーバーまたはステージングサーバーは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>
もちろん、その後、letsencryptcmdも調整する必要があります。エイリアスターゲットを指している必要があります。
./letsencrypt-auto --debug certonly --webroot -w /var/www/example.com/.well-known --email [email protected] --domains example.com