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
Apache .htaccess |重定向太多_Apache_.htaccess_Mod Rewrite_Redirect - Fatal编程技术网

Apache .htaccess |重定向太多

Apache .htaccess |重定向太多,apache,.htaccess,mod-rewrite,redirect,Apache,.htaccess,Mod Rewrite,Redirect,我想在我的.htaccess文件中添加一个IP筛选器,但在应用它之后,将显示一个过多重定向错误 .htaccess的内容: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ RewriteRule ^(.*)$ https://ww

我想在我的
.htaccess
文件中添加一个IP筛选器,但在应用它之后,将显示一个过多重定向错误

.htaccess
的内容:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [L,R=301]
RewriteCond %{HTTPS} on

RewriteCond %{REMOTE_ADDR} xxx.xxx.xxx.xxx
RewriteRule ^ /test.php [R=302,L]

为什么会出现此错误?

我假设您在这里尝试做两件事:

  • 强制HTTPS和www
  • 如果某个IP正在发出请求,则重定向到
    test.php
  • 您面临的问题是,即使IP地址被匹配,但在到达
    test.php
    时仍在检查它。由于会再次出现匹配,重定向将持续循环。通过添加适当的条件,我们在检查IP地址之前检查请求的URI是否不是
    test.php
    。我的答案底部附近显示了这一行,其中包括对原始代码的增强

    重新编写引擎打开
    #强制HTTPS
    重写cond%{HTTPS}!在…上
    重写规则(*)https://%{HTTP\u HOST}%{REQUEST\u URI}
    #强制www
    重写cond%{HTTP_HOST}^www\。
    重写cond%{HTTPS}s^on(s)| off
    重写第二个http%1://%{http_HOST}^(https?://)(www\)(.+)$
    重写规则^%1%3%{REQUEST_URI}[R=301,L]
    #如果某个IP匹配,则重定向到test.php
    重写cond%{REQUEST_URI}^/test\.php
    重写cond%{REMOTE_ADDR}xxx.xxx.xxx.xxx
    重写规则^/test.php[R=302,L]
    
    如果需要匹配多个IP地址,则应为每个IP地址(最后一个除外)使用
    标志:

    #如果某组IP匹配,则重定向到test.php
    重写cond%{REQUEST_URI}^/test\.php
    重写cond%{REMOTE_ADDR}xxx.xxx.xxx.xxx[或]
    重写cond%{REMOTE_ADDR}xxx.xxx.xxx.xxx[或]
    重写cond%{REMOTE_ADDR}xxx.xxx.xxx.xxx[或]
    重写cond%{REMOTE_ADDR}xxx.xxx.xxx.xxx
    重写规则^/test.php[R=302,L]
    
    因为如果
    %{REMOTE\u ADDR}
    匹配,您将发送
    /test.php
    位置
    头,浏览器将重定向到该头。此时,它将匹配
    %{REMOTE_ADDR}
    ^
    ,然后发送
    /test.php
    位置
    头。在那一点上……事实上——我原以为循环来自
    www.
    的测试。我会更新我的答案,谢谢你指出这一点。非常感谢。我可以做些什么来隐藏url吗?因此,如果我想重定向到子文件夹中的文件,我如何重写显示的url?如“/test/index.html”->“/”。很高兴它对您有用。如果您有新问题,请回答,因为您原来的问题已得到回答。不过,作为旁注,我认为这是不切实际的。最好重定向到单独的页面。但是,您可以在检查IP地址之前创建一个将
    /test
    映射到
    /test.php
    的规则。然后您可以重定向到
    /test
    。最后!一个真正有效的答案!谢谢你,先生!