Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将特定目录的Http重定向限制为Https?_Php_.htaccess_Redirect - Fatal编程技术网

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

Php 如何将特定目录的Http重定向限制为Https?,php,.htaccess,redirect,Php,.htaccess,Redirect,我正在将用户从Http重定向到Https,它工作正常,但客户端的要求是为此跳过一个目录 例如:如果用户访问以下url,则不应重定向到https:www.example.com/ads,但如果用户访问任何其他url,则应重定向到https 以下是我当前使用的代码: <VirtualHost *:80> ServerName example.com ServerAlias www.example.com RewriteEngine on RewriteRule ^

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

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

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

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

你可以试试类似的东西

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

您可以为“重写规则”添加重写条件,只有在满足这些条件时才会执行重定向

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

可以在上找到所有可用变量和其他代码段。

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

使用_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并完全清除浏览器缓存。

您使用的不是PHP!但如果您的apache重定向允许,您可以轻松地在PHP中使用header^ads$|/https://www.example.com%{REQUEST_URI}[L,R=301]您还可以在重定向规则之前的apache配置中添加异常:RewriteCond%{REQUEST_URI}^/adsTry:重写规则!^/?ads$|/https://www.example.com%{REQUEST_URI}[L,R=301]作为第一条规则,并清除浏览器缓存以进行测试。@anubhava通过添加您给出的规则,我得到一个未找到的错误。我想再次解释,我需要应用重定向301对我的网站除了广告文件夹的整个目录意味着广告文件夹必须像整个网站一样访问。希望现在我的观点是明确的。我尝试了这个,它没有重定向到https,这很好,但现在它显示了一个错误的页面未找到,有什么想法吗?如果它没有重定向,这意味着规则没有按预期执行。在此之后,404是在该规则之外发生的事情,因为该规则被跳过。是http://www.example.com/ads/ 导致404?如果我撤销您所做的更改,这个url就可以工作,有什么想法吗?注释掉第二行,然后用相同的代码重新测试http://www.rentown.net/ads/mbl/formland/001/a_opt/btw 我越来越https://www.rentown.net/ads/mbl/formland/001/a_opt/ 也不受上述规则的影响。