htaccess-重定向非https并为每个子域设置不同的默认页面

htaccess-重定向非https并为每个子域设置不同的默认页面

我的域名有通配符 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:

  1. 所有流量都定向到 https
  2. 子域名解析到各自的默认页面
  3. 所有非 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可能会感兴趣。

相关内容