Назад | Перейти на главную страницу

Apache Force WWW и SSL и поддержка других субдоменов

Я искал несколько часов и подошел очень близко, но не до конца.

В настоящее время я использую его как файл виртуальных хостов.

ServerName example.com
DocumentRoot /mnt/WWW
ServerAdmin support@krc.com.au
RemoteIPHeader X-Forwarded-For

# Needed before any rewriting
RewriteEngine On

### Built using the .htaccess 301 Redirect Generator from Web Site Advantage
### https://websiteadvantage.com.au/HtAccess-301-Redirect-Generator
### Place after 'RewriteEngine On' and before any CMS specific rewrite rules

# Redirect HTTP with www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Redirect HTTP without www to HTTPS with www
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Redirect HTTPS without www to HTTPS with www
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

## 301 Redirects

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

<VirtualHost *:443>
    DocumentRoot "/mnt/WWW/www.example.com"
    ServerName www.example.com
    ServerAlias www.example.com

    <Directory />
        Options Indexes FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /root/ssl/example.com.crt
    SSLCertificateKeyFile /root/ssl/private.key
    SSLCACertificateFile /root/ssl/intermediateCA.crt
</VirtualHost>

<VirtualHost *:443>
    # NAS
    ServerName nas.example.com
    ServerAlias nas.example.com

    ProxyPass / http://10.0.28.1:5000/
    ProxyPassReverse / http://10.0.28.1:5000/

    SSLEngine on
    SSLProxyEngine on
    SSLCertificateFile /root/ssl/example.com.crt
    SSLCertificateKeyFile /root/ssl/private.key
    SSLCACertificateFile /root/ssl/intermediateCA.crt
</VirtualHost>

Вот что я пытаюсь сделать. У меня есть корневая папка / mnt / WWW.

Я хочу, чтобы ВСЕ HTTP-запросы автоматически переключались на https. Затем я хочу, чтобы все субдомены без www оставались субдоменом, но заставляю example.com всегда быть www.example.com

В настоящее время это работает следующим образом:

http://example.com      -> https://www.example.com     = Correct
http://www.example.com  -> https://www.example.com     = Correct
http://sub.example.com  -> https://www.sub.example.com = Wrong - Should be https://sub.example.com
https://example.com     -> https://example.com         = Wrong - Should be https://www.example.com
https://www.example.com -> https://www.example.com     = Correct
https://sub.example.com -> https://sub.example.com     = Correct

Я могу заставить большинство из этих вещей работать в какой-то момент, но мне еще предстоит заставить их ВСЕ работать одновременно в одной конфигурации.

Кроме того, я пытаюсь упростить код, установив общие настройки по умолчанию. Есть ли другой способ минимизировать повторяющиеся строки, которые являются общими для всех обратных прокси и т.п.?

Я изменил Rewrite на следующее:

#Force WWW Subdomain
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[0-9a-zA-Z-]+\.[a-zA-Z]{2,}$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}:443$1 [R=301,L]

#Force SSL
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}:443$1 [R,L]

Теперь все работает.