.htaccess需要特定URL的SSL

时间:2008-11-03 03:33:22

标签: apache mod-rewrite

我想强制Apache以下列形式对特定网址使用HTTPS:

https://www.example.com/signup/*

所以

如果有人直接转到以下任何示例网址,Apache会将网址转发到HTTPS等效网站。

e.g。

http://www.example.com/signup  -->  https://www.example.com/signup
http://www.example.com/signup/basic+plan  -->  https://www.example.com/signup/basic+plan
http://www.example.com/signup/premium  -->  https://www.example.com/signup/premium 

任何人都知道怎么做?

提前致谢

7 个答案:

答案 0 :(得分:5)

感谢Murat,

你几乎工作但是想出了如何让它完全正常工作。

以下是有效的:

RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/$1 [R,L]

请注意,我没有在www.domain.com rewriterule中包含某些文件夹

答案 1 :(得分:4)

我认为这就是我用过的东西:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

(来自here

答案 2 :(得分:3)

您可以使用Redirect指令:

Redirect 301 /signup https://www.example.com/signup

这将自动保留URL中的/注册后的任何内容。请确保仅在非SSL站点上配置此指令,否则它可能会进入递归循环!

答案 3 :(得分:1)

您应该查看mod_rewrite文档

答案 4 :(得分:1)

我使用以下内容要求网站的结帐部分要求SSL:

<Directory "/var/www/html">
        RewriteEngine on
        Options +FollowSymLinks
        Order allow,deny
        Allow from all
        RewriteCond %{SERVER_PORT} !^443$
        RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
        RewriteRule ^checkout(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Directory>

例如,点击http://www.example.com/checkout重定向到https://www.example.com/checkout

该规则将跳过通常包含在页面中的文件扩展名,这样您就不会收到混合内容警告。您应该根据需要添加到此列表中。

如果您想要多个页面,请将RewriteRule更改为:

RewriteRule ^(checkout|login)(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

当然,该目录应与服务器上的实际路径匹配。此页面还可以为您的特定需求提供更多信息:http://www.whoopis.com/howtos/apache-rewrite.html

我在运行Plesk 8.6的网站上使用它,但这无关紧要。这是在我的vhost.conf文件中,就像把它放在你的httpd.conf文件中一样。我不确定你是否需要调整任何东西才能在.htaccess文件中使用它,但我对此表示怀疑。如果添加到conf文件,请不要忘记重新启动apache以重新加载配置。

如果您像我一样并且只想在特定页面上使用SSL,那么您还需要一个重写规则,将其发送回常规http。您可以使用以下内容进行反向效果:

RewriteCond %{SERVER_PORT} ^443$
RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
RewriteRule !^(checkout|login)(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [L,R]

如果您正在使用Plesk,请记住,所有非SSL流量都使用vhost.conf文件,但所有SSL流量都使用vhost_ssl.conf文件。这意味着您需要SSL的第一个重写规则将放在vhost.conf文件中,但强制返回非SSL的第二个规则必须放在vhost_ssl文件中。如果您使用的是httpd.conf或.htaccess,我认为您可以将它们放在同一个地方。

我也在我的博客上发布了这个教程:Apache rewrite rules to force secure/non-secure pages

答案 5 :(得分:0)

您可以使用mod_rewrite -

执行此操作

RewriteCond%{SERVER_PORT}!^ 443 $

RewriteRule ^ / signup https://example.com/signup

RewriteRule ^ / signup /(.*)$ https://example.com/signup/ $ 1

应该可行,但我还没有测试过。

- 编辑 -

更正,我刚在我的一台服务器上试过这个,它对我来说很好用。您可能需要重新检查mod_rewrite配置。此外,如果您使用.htaccess,则需要确保该目录允许覆盖。

作为旁注,这假设您的SSL流量通过端口443。如果不是,则需要相应地调整重写条件。

答案 6 :(得分:0)

.htaccess文件通常放在带有选项-FollowSymLinks的范围内,该范围可阻止重写规则。这通常是安全规则。

因此经常需要这样的琐碎事情:

<If "%{HTTPS} != 'on'">
  Redirect 301 /your/path https://www.example.com/your/path
</If>

这是对Greg Hewgill答案的一个小增强。