Apache – 如何使http请求变成只有https?

如何判断用户是否使用http://ttt.com或http://www.ttt.com ,将其redirect到https://www.ttt.com ?

httpd.conf中:

<VirtualHost *:80> ServerName www.ttt.com ServerAlias ttt.com DocumentRoot /home/www/html/ttt/public <Directory /home/www/html/ttt/public> #Options ExecCGI #AddDefaultCharset utf-8 DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> 

.htaccess

 RewriteEngine On ############################################ ## always send 404 on missing files in these folders #RewriteCond %{REQUEST_URI} !^/(files)/ RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L] 

在主目录.htaccess文件中尝试以下代码:

 DirectoryIndex index.php RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R] 

你可以用httpd.conf来做到这一点:

 <VirtualHost *:80> serverName www.ttt.com Redirect "/" "https://www.ttt.com/" </VirtualHost> <VirtualHost *:443> serverName www.ttt.com ... ... </VirtualHost> 

或从.htaccess文件中:

 RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

这里你去: https : //wiki.apache.org/httpd/RedirectSSL

将请求重定向到SSL

假设您希望http://www.example.com/secure/始终通过SSL发送(我在这里假定普通和SSL虚拟主机都具有相同的内容)&#x3002; 你可以通过链接到你的HTML页面中的正确页面来做到这一点…但总是会有一些用户以这种方式潜入。

使用虚拟主机(使用重定向)

使用SSL时,您至少需要两台虚拟主机:一台用于端口80,用于提供普通请求,另一台用于端口443以提供SSL。 如果您希望将用户从非安全站点重定向到SSL站点,则可以在不安全的VirtualHost内使用普通的Redirect指令:

 NameVirtualHost *:80 <VirtualHost *:80> serverName mysite.example.com DocumentRoot /usr/local/apache2/htdocs Redirect permanent /secure https://mysite.example.com/secure </VirtualHost> <VirtualHost _default_:443> serverName mysite.example.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost> 

当重定向你甚至不需要DocumentRoot的时候:

 NameVirtualHost *:80 <VirtualHost *:80> serverName www.example.com Redirect permanent / https://secure.example.com/ </VirtualHost> <VirtualHost _default_:443> serverName secure.example.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost> 

注意 :重定向也可以在.htaccess文件中使用,或者用于处理特定的URL,如下所示:

例:

重定向永久/登录https://mysite.example.com/login

使用mod_rewrite

虽然建议使用这个解决方案,因为它更简单,更安全,但也可以使用mod_rewrite获得与此处所述相同的效果: RewriteHTTPToHTTPS

https://httpd.apache.org/docs/trunk/mod/mod_alias.html#redirect

 # Redirect to a URL on a different host Redirect "/service" "http://foo2.example.com/service" # Redirect to a URL on the same host Redirect "/one" "/two" 

如果客户端请求http://example.com/service/foo.txt ,则会被告知访问http://foo2.example.com/service/foo.txt 。 这包括使用GET参数的请求,例如http://example.com/service/foo.pl?q=23&a=42 ,它将被重定向到http://foo2.example.com/service/foo.pl&#xFF1F; q = 23&a = 42 。 请注意,POST将被丢弃。 只有完整的路径段被匹配,所以上面的例子不匹配http://example.com/servicefoo.txt的请求&#x3002; 要使用表达式语法进行更复杂的匹配,请按照下面的说明省略URL路径参数。 或者,对于使用正则表达式进行匹配,请参阅RedirectMatch指令。

如果您希望将www.example.com/*example.com/*重定向,则可以使用不同的serverName创建两个VirtualHost,或者使用Rewrite插件。