【问题标题】:.htaccess require SSL for a particular URL.htaccess 要求特定 URL 的 SSL
【发布时间】:2008-11-03 03:33:21
【问题描述】:

我想强制 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 

有人知道怎么做吗?

提前致谢

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    感谢穆拉特,

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

    以下是有效的:

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

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

    【讨论】:

    • 尝试在cmets中回答cmets =)
    【解决方案2】:

    我认为这是我使用的:

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

    (来自here

    【讨论】:

    【解决方案3】:

    您可以使用Redirect 指令:

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

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

    【讨论】:

    • 当我使用您的代码示例,然后在 Firefox 中转到 example.com/signup 以测试它是否重定向到 https 时,我收到以下 Firefox 错误:“Firefox 检测到服务器是以永远不会完成的方式重定向对该地址的请求。”
    • 您可能将重定向指令添加到 SSL 和非 SSL 站点。您将希望将其添加到非 SSL 站点。
    • 这需要一个 封闭
    【解决方案4】:

    你应该看看mod_rewrite 文档

    【讨论】:

      【解决方案5】:

      我使用以下方法要求网站的结帐部分需要 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

      【讨论】:

        【解决方案6】:

        你可以用 mod_rewrite 做到这一点 -

        RewriteCond %{SERVER_PORT} !^443$

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

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

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

        -- 编辑--

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

        附带说明,这假设您的 SSL 流量来自端口 443。如果不是,您需要相应地调整重写条件。

        【讨论】:

          【解决方案7】:

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

          所以经常需要这样一件更琐碎的事情:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-20
            • 1970-01-01
            相关资源
            最近更新 更多