如何将Http重定向限制为特定目录的Https?

时间:2017-03-22 08:47:15

标签: php .htaccess redirect

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

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

以下是我目前使用的代码:

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

3 个答案:

答案 0 :(得分:1)

您可以尝试类似

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

答案 1 :(得分:0)

您可以为重写规则添加重写条件,并且只有在满足重定向时才会执行重定向。

在你的情况下,你需要第一个规则检查当前请求是否没有使用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>

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

答案 2 :(得分:0)

假设您在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并完全清除浏览器缓存。