1

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

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

所以

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

例如

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 

有谁知道怎么做?

提前致谢

4

7 回答 7

5

感谢穆拉特,

你的几乎工作了,但想出了如何让它完全工作。

以下是有效的:

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

请注意,我没有在 www.domain.com rewriterule 中包含 somefolder

于 2008-11-03T15:07:00.750 回答
4

我想这就是我用的:

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

(从这里

于 2008-11-03T04:19:44.723 回答
3

您可以使用重定向指令:

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

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

于 2008-11-03T03:37:40.597 回答
1

你应该看看mod_rewrite文档

于 2008-11-03T03:35:22.160 回答
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

于 2009-03-28T17:39:14.157 回答
0

你可以用 mod_rewrite 做到这一点 -

RewriteCond %{SERVER_PORT} !^443$

重写规则 ^/signup https://example.com/signup

重写规则 ^/signup/(.*)$ https://example.com/signup/ $1

应该可以,虽然我没有测试过。

- 编辑 -

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

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

于 2008-11-03T03:55:19.033 回答
0

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

因此,通常需要像这样的更琐碎的事情:

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

这是对 Greg Hewgill 答案的一个小改进。

于 2018-07-23T14:06:34.137 回答