Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 如何将除子域之外的所有通信重定向到https_.htaccess_Http_Redirect_Https - Fatal编程技术网

.htaccess 如何将除子域之外的所有通信重定向到https

.htaccess 如何将除子域之外的所有通信重定向到https,.htaccess,http,redirect,https,.htaccess,Http,Redirect,Https,我最近将所有流量重定向到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,但我只想将我的子域保留在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>

服务器管理员test@example.com
ServerName staging.example.com
ServerAlias staging.example.com
SetEnv环境暂存
DocumentRoot/var/www/staging/
ErrorLog/var/log/apache2/example_staging_error.log
CustomLog/var/log/apache2/example_staging_access.log组合
允许超越所有
Include/etc/apache2/sites available/example_dir_rules.conf
服务器管理员test@example.com
ServerName example.com
ServerAlias example.com
环境生产
DocumentRoot/var/www/production/
ErrorLog/var/log/apache2/example\u production\u error.log
CustomLog/var/log/apache2/example\u production\u access.log组合
Include/etc/apache2/sites available/example_dir_rules.conf
LoadModule ssl_module/usr/lib/apache2/modules/modules\u ssl.so
#听我说
斯伦金安
SSLHonorCipherOrder开启
-------------ssl代码----------
ServerName example.com
-------------ssl代码----------
服务器管理员test@example.com
ServerName example.com
ServerAlias example.com
环境生产
DocumentRoot/var/www/production/
ErrorLog/var/log/apache2/example\u ssl\u error.log
CustomLog/var/log/apache2/example\u ssl\u access.log组合
Include/etc/apache2/sites available/example_dir_rules.conf

请帮我整理一下。提前谢谢。

您有两个选择

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
(vhost中没有
www
的痕迹)

警告:在某些情况下无效,您不应该在所有vhost中包含相同的文件(请参阅下一点)

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

因此,您的配置应该如下所示

<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>

服务器管理员test@example.com
ServerName staging.example.com
ServerAlias staging.example.com
SetEnv环境暂存
DocumentRoot/var/www/staging/
ErrorLog/var/log/apache2/example_staging_error.log
CustomLog/var/log/apache2/example_staging_access.log组合
服务器管理员test@example.com
ServerName example.com
ServerAlias example.com
环境生产
DocumentRoot/var/www/production/
ErrorLog/var/log/apache2/example\u production\u error.log
CustomLog/var/log/apache2/example\u production\u access.log组合
选项+FollowSymlinks
重新启动发动机
重写规则^https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
LoadModule ssl_module/usr/lib/apache2/modules/modules\u ssl.so
#听我说
斯伦金安
SSLHonorCipherOrder开启
-------------ssl代码----------
ServerName example.com
-------------ssl代码----------
服务器管理员test@example.com
ServerName example.com
ServerAlias example.com
环境生产
DocumentRoot/var/www/production/
ErrorLog/var/log/apache2/example\u ssl\u error.log
CustomLog/var/log/apache2/example\u ssl\u access.log组合

“这是我的重写规则”-你的“重写规则”在哪里?由于您似乎有权访问服务器配置,因此您应该在虚拟主机中执行此重定向-这样会更高效,并且可能更容易避开子域。哪些子域?或者,更确切地说,您希望重定向到哪个主机的HTTPS?我已经在/etc/apache2/sites available/example_dir_rules.conf文件中编写了重写规则,并且通过将规则直接放在主域的HTTP虚拟主机(端口80)中,将该文件包含到主机文件中,这样就不需要检查
HTTPS
。事实上,在上面的代码中,不需要mod_重写或
包装器。它只是一个带有mod_别名的单行程序:
Redirect 301/https://example.com/
@user82217您是对的,只是忘了删除条件(即使它始终为真,因此总是经过计算)。事实上,我们可以完全摆脱mod_rewrite,使用mod_alias和
重定向