【问题标题】:How to redirect all traffic to https except subdomains如何将所有流量重定向到 https,子域除外
【发布时间】:2017-10-23 09:13:31
【问题描述】:

我最近将所有流量重定向到 https,但我只想将我的子域保留在 http 上。请帮我解决这个问题。

这是我的重写规则

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

这是我的虚拟主机代码

<VirtualHost *:80>
ServerAdmin  test@example.com
ServerName   staging.example.com
ServerAlias  staging.example.com
SetEnv       ENVIRONMENT staging
DocumentRoot /var/www/staging/
ErrorLog     /var/log/apache2/example_staging_error.log
CustomLog    /var/log/apache2/example_staging_access.log combined

<Directory /var/www/staging>
AllowOverride All
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>


</VirtualHost>

<VirtualHost *:80>
ServerAdmin  test@example.com
ServerName   example.com
ServerAlias  example.com
SetEnv       ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog     /var/log/apache2/example_production_error.log
CustomLog    /var/log/apache2/example_production_access.log combined

<Directory /var/www/production>
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>



</VirtualHost>
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
#Listen 443
<VirtualHost *:443>
SSLEngine on

SSLHonorCipherOrder On

-------------ssl code----------

ServerName example.com

-------------ssl code----------

ServerAdmin  test@example.com
ServerName   example.com
ServerAlias  example.com
SetEnv       ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog     /var/log/apache2/example_ssl_error.log
CustomLog    /var/log/apache2/example_ssl_access.log combined


<Directory /var/www/production>
Include /etc/apache2/sites-available/example_dir_rules.conf
</Directory>


</VirtualHost>

请帮我解决这个问题。提前致谢。

【问题讨论】:

  • “这是我的重写规则” - 你的“重写规则”在哪里?由于您似乎可以访问您的服务器配置,那么您应该在您的虚拟主机中执行此重定向 - 这将更有效并且可能更容易避免您的子域。哪些子域?或者更确切地说,您希望为哪个主机重定向到 HTTPS?
  • 我已经在 /etc/apache2/sites-available/example_dir_rules.conf 文件中编写了重写规则,并且我已将此文件包含在主机文件中

标签: .htaccess http redirect https


【解决方案1】:

你有两个选择。

1.您可以在文件中添加一个条件以仅匹配主域

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

请注意,可以删除匹配 www 主域的规则,因为您的主域是 example.com(在您的虚拟主机中没有 www 的痕迹)。

警告:在某些情况下无用,您不应在所有虚拟主机中包含相同的文件(请参阅下一点)。

2. 或者您可以直接example.com (http) vhost 块中添加规则。事实上,其他两个(example.com 用于 https 和 stagging 子域)不需要规则来做你想做的事。

所以,你的配置应该是这样的

<VirtualHost *:80>
ServerAdmin  test@example.com
ServerName   staging.example.com
ServerAlias  staging.example.com
SetEnv       ENVIRONMENT staging
DocumentRoot /var/www/staging/
ErrorLog     /var/log/apache2/example_staging_error.log
CustomLog    /var/log/apache2/example_staging_access.log combined

<Directory /var/www/staging>
</Directory>


</VirtualHost>

<VirtualHost *:80>
ServerAdmin  test@example.com
ServerName   example.com
ServerAlias  example.com
SetEnv       ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog     /var/log/apache2/example_production_error.log
CustomLog    /var/log/apache2/example_production_access.log combined

<Directory /var/www/production>
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</Directory>



</VirtualHost>
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
#Listen 443
<VirtualHost *:443>
SSLEngine on

SSLHonorCipherOrder On

-------------ssl code----------

ServerName example.com

-------------ssl code----------

ServerAdmin  test@example.com
ServerName   example.com
ServerAlias  example.com
SetEnv       ENVIRONMENT production
DocumentRoot /var/www/production/
ErrorLog     /var/log/apache2/example_ssl_error.log
CustomLog    /var/log/apache2/example_ssl_access.log combined


<Directory /var/www/production>
</Directory>


</VirtualHost>

【讨论】:

  • 通过将规则直接放在主域的 HTTP 虚拟主机(端口 80)中,则无需检查 HTTPS。事实上,在上面的代码中,不需要 mod_rewrite 或 &lt;Directory&gt; 包装器。它只是一个带有 mod_alias 的单行代码:Redirect 301 / https://example.com/
  • @user82217 你是对的,只是忘了删除条件(即使它总是为真,因此总是被评估)。事实上,我们可以完全摆脱 mod_rewrite 并使用带有 Redirect 的 mod_alias 来代替
猜你喜欢
  • 2016-03-11
  • 2016-09-16
  • 2021-11-04
  • 2015-04-26
  • 1970-01-01
  • 2015-03-13
  • 2012-06-03
  • 2012-04-19
  • 2021-12-14
相关资源
最近更新 更多