【问题标题】:How to restrict Http redirection to Https for specific directory?如何限制特定目录的 Http 重定向到 Https?
【发布时间】:2017-03-22 08:47:15
【问题描述】:

我正在将用户从 Http 重定向到 Https,它工作正常,但客户要求为此跳过一个目录。

例如:如果用户访问以下 url:www.example.com/ads,则不应重定向到 https,但如果访问任何其他 URL,则应重定向。

这是我目前使用的代码:

<VirtualHost *:80>
   ServerName example.com
   ServerAlias www.example.com
   RewriteEngine on
   RewriteRule ^/(.*)$ https://www.example.com/$1 [QSA,L,R=301]
</VirtualHost>

【问题讨论】:

  • 那么您使用的不是 PHP !但是如果你的 apache 重定向允许你,你可以很容易地在 PHP 中使用 header。
  • 你可以试试RewriteRule !^ads($|/) https://www.example.com%{REQUEST_URI} [L,R=301]
  • 您还可以在您的重定向规则之前在您的 apache 配置中添加例外:RewriteCond %{REQUEST_URI} !^/(ads)

标签: php .htaccess redirect


【解决方案1】:

你可以试试

RewriteRule !^ads($|/) https://www.example.com%{REQUEST_URI} [L,R=301]

【讨论】:

  • 尝试:RewriteRule !^/?ads($|/) https://www.example.com%{REQUEST_URI} [L,R=301] 作为您的第一条规则并清除浏览器缓存以进行测试。
  • @anubhava 通过添加您给出的规则,我收到“未找到”错误。我想再次解释一下,我需要在我网站的整个目录上应用重定向 301,除了“ads”文件夹意味着“ads”文件夹必须像 example.com/ads 和整个网站一样访问,如“example.com”。希望现在我的观点很清楚了。
【解决方案2】:

重写规则可以添加重写条件,满足时才会执行重定向。

在您的情况下,您需要第一个规则来检查当前请求是否没有使用 https 完成(不要无限重定向到相同的 uri),第二个规则是请求 uri 和可选的主机规则(如果您使用多个主机名字,否则你可以跳过它)。这段代码应该可以工作:

<VirtualHost *:80>
    ServerName example.com

    RewriteEngine on

    RewriteCond %{HTTP:PORT} !^443$ #Some other variants are available , but I prefer this one because not all work well on different environments
    RewriteCond %{REQUEST_URI} !^/ads$
    RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
    RewriteRule ^/(.*)$ https://www.example.com/$1 [QSA,L,R=301]
</VirtualHost>

所有可用的变量和其他代码 sn-ps 都可以在official documentation page 上找到。

【讨论】:

    【解决方案3】:

    假设您在 ads/ 子目录中没有 .htaccess。

    使用THE_REQUEST 变量让您的排除规则如下所示:

    <VirtualHost *:80>
       ServerName example.com
       ServerAlias www.example.com
    
       RewriteEngine on
    
       RewriteCond %{THE_REQUEST} !\s/+ads [NC]
       RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R=301]
    </VirtualHost>
    

    不要忘记重新启动 Apache 并彻底清除浏览器缓存。

    【讨论】:

    • 我试过了,它没有重定向到 https 这很好,但现在它显示页面未找到的错误,你知道吗?
    • 如果它没有重定向这意味着规则没有按预期执行。在那之后 404 是在此规则之外发生的事情,因为规则被跳过了。 http://www.example.com/ads/ 会导致 404 吗?
    • 如果我撤消你给出的更改,这个网址可以工作,知道吗?
    • 注释掉RewriteCond这一行,然后用同样的http://www.rentown.net/ads/mbl/formland/001/a_opt/重新测试
    • 顺便说一句,我也收到了https://www.rentown.net/ads/mbl/formland/001/a_opt/,它不受上述规则的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2020-01-02
    • 2016-11-14
    相关资源
    最近更新 更多