Jump to content

Let's Encrypt .htaccess Conditions


sanjom
 Share

Recommended Posts

Hey, I've used ProcessWire for a while now but not made an appearance in the forum yet :D I just wanted to share the solution to a small problem I came across with Let's Encrypt (free SSL service).

Let's Encrypt SSL certificates need to be renewed every few months to remain active. My web host does this automatically but needs access to a folder named ".well-known", which ProcessWire blocks by default because it starts with a dot. This results in a 403 error.

To work around this, just add the following line to your .htaccess file, around line 150:

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

It should be the first condition in the section titled "Access Restrictions: Keep web users out of dirs that begin with a period".

I also ran into another problem. Let's Encrypt accesses mail.example.com which is redirected to www.mail.example.com because I enabled the redirection in my .htaccess fie. So we need to exclude the mail sub domain from that rule using the following line as the second condition in the www-redirection section (around line 160):

RewriteCond %{HTTP_HOST} !^mail\. [NC]

I know it's quite a specific problem but maybe it'll help someone Googling the issue.

I was curious, is there any way of redirecting to the www-version without having to exclude all your sub domains? The only way I can think of involves explicitly writing out your domain name in the .htaccess file and redirecting whenever the %{HTTP_HOST} starts with that name. But obviously that would lead to a loss of generality.

  • Like 5
Link to comment
Share on other sites

Hi,

6 hours ago, sanjom said:

It should be the first condition in the section titled "Access Restrictions: Keep web users out of dirs that begin with a period".

As far as I know, since ProcessWire 3.0.29 we have RewriteRule "(^|/)\.(?!well-known)" - [F] there by default. See: https://processwire.com/blog/posts/pw-3.0.29/#summary-of-added-pull-requests

 

 

  • Like 5
Link to comment
Share on other sites

  • 1 month later...
  • 7 months later...

I have not been having this kind of problem since 3.0.29.  My issue is I have the htaccess file  forcing https and that breaks the renewal process.  Currently I rename the htaccess to something like htaccess1, then do the renewal manually then rename the htaccess file back to normal.  Anyone have a tip on how I can still use the automated way with https?   Sorry to hijack this thread.

Link to comment
Share on other sites

  • 4 weeks later...

I am using acme.sh with the webroot validation mode and don't have an issue with https for renewal.  However, I put this in my .htaccess in case I ever have to start from scratch.

  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteCond %{REQUEST_URI} "!(^|/)\.well-known"
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

The interesting bit is the 2nd line, which effectively says "to redirect from http to https, the URI cannot match .well-known or anything/.well-known".

In the PW-installed .htaccess this is the #9 block of directives that redirects from http to https, not the #12 block of access control restrictions. The sense of the comparison with ".well-known" here is different than in block #12.  Additionally, the exact format of the 1st line will depend on how your web server frontend/load-balancer is configured.  Alternatives involve %{HTTPS}, %{HTTP:X-Forwarded-SSL}, %{HTTP:Forwarded}, etc, and you should not change whatever is already working for you in the 1st line.

Link to comment
Share on other sites

I'm currently having this problem on siteground. Running multisite pw the .well-known directory and files are not created, let alone accessible. If I create the directories in the pw/ directory and try accessing them directly I can browse to them, but if I use one of the multisite domains it will not find the directory in pw/ - should it be looking somewhere else? Do I need to alter the base directory for each multisite? They are currently all pointing at the pw/ directory.

Thanks!

Link to comment
Share on other sites

5 hours ago, gornycreative said:

If I create the directories in the pw/ directory and try accessing them directly I can browse to them, but if I use one of the multisite domains it will not find the directory in pw/ - should it be looking somewhere else? Do I need to alter the base directory for each multisite? They are currently all pointing at the pw/ directory.

There are different possible approaches, but this should work:

  • create a subdirectory in your web root for every domain, named exactly like the domain
  • make sure ownership is correct
  • add a rewrite rule in .htaccess before #12 that prepends the requested host name to the path:
  RewriteCond %{REQUEST_URI} ^/?\.well-known
  RewriteRule "(^|/)(.*)$" $1%{HTTP_HOST}/$2 [L]

  • start letsencrypt with webroot option pointing to /path/to/pw/domain-in-question for every domain
  • enjoy

 

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...