我的域名有通配符 SSL。我有许多子域名,每个子域名都有自己的默认页面。
www.domain.com/main.html [/home/domain/main.html]
try.domain.com/free.php [/home/domain/try/free.php]
new.domain.com/signup.php [/home/domain/new/signup.php]
等等
我想这样写 .htaccess:
- 所有流量都定向到 https
- 子域名解析到各自的默认页面
- 所有非 www 都指向 www,除了子域名仍为 subdomain.domain.com
我想在单个 htaccess /home/domain/.htacces 中完成所有这些操作,而不是在每个文件夹中都有 htaccess 文件。
答案1
在我看来,你已经走错了方向,你想要创建一个.htaccess
文件,这是我最讨厌的,引用自.htaccess 手册文件:
你应该完全避免使用
.htaccess
文件 如果你有权访问 httpd 主服务器配置文件。使用.htaccess
文件会减慢你的 Apache http 服务器速度. 任何可以包含在.htaccess
文件中的指令最好都设置在Directory
在主 Apache 配置文件中阻止,因为它具有相同的效果,但性能更好。
在端口 80 上设置默认/catchall VirtualHost,用于将纯 HTTP 的所有内容重定向到您的安全主机:
<VirtualHost :80>
Servername www.example.com
ServerAlias *.example.com
# https://wiki.apache.org/httpd/RewriteHTTPToHTTPS
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
>other optional directives<
</VirtualHost>
重定向到 SSL 时,上述操作将保留主机名。
那么更有效的配置是利用你有一个通配符 SSL 证书(你甚至不需要依赖 SNI)和 为每个子域名创建一个名称虚拟主机,最后一个规则是,任何未明确定义的子域名都会重定向到 www
<VirtualHost *:443>
SSLEngine on
>>other optional and required (SSL) directives<<
SSLCertificateFile /etc/ssl/star.example.com.crt
SSLCertificateKeyFile /etc/ssl/star.example.com.key
ServerName "one.example.com"
DocumentRoot "/var/www/html/one"
</virtualHost>
<VirtualHost *:443>
SSLEngine on
>>other optional and required (SSL) directives<<
SSLCertificateFile /etc/ssl/star.example.com.crt
SSLCertificateKeyFile /etc/ssl/star.example.com.key
ServerName "two.example.com"
DocumentRoot "/var/www/html/two"
</virtualHost>
<VirtualHost *:443>
SSLEngine on
>>other optional and required (SSL) directives<<
SSLCertificateFile /etc/ssl/star.example.com.crt
SSLCertificateKeyFile /etc/ssl/star.example.com.key
ServerName "www.example.com"
DocumentRoot "/var/www/html/www"
</virtualHost>
# Use the fact that the configuration file is parsed in order
# and make this catch-all entry only catch what isn't defined above:
<VirtualHost *:443>
SSLEngine on
>>other optional and required (SSL) directives<<
SSLCertificateFile /etc/ssl/star.example.com.crt
SSLCertificateKeyFile /etc/ssl/star.example.com.key
ServerName "star.example.com"
ServerAlias *.example.com
Redirect / https://www.example.com
</virtualHost>
或者如果你喜欢最低配置:mod_vhost_alias可能会感兴趣。