Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.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 修复ApacheInifinte循环-确定引用器_Php_Wordpress_Apache_.htaccess - Fatal编程技术网

Php 修复ApacheInifinte循环-确定引用器

Php 修复ApacheInifinte循环-确定引用器,php,wordpress,apache,.htaccess,Php,Wordpress,Apache,.htaccess,我有以下Apache配置设置: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} wp-content/uploads/gravity_forms RewriteRule .* /cmssystem46/wp-content/uploads/test_script.php [L] </IfModule> 你看到问题了吗?wp content/uploads/gravity_form

我有以下Apache配置设置:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_URI} wp-content/uploads/gravity_forms
RewriteRule .* /cmssystem46/wp-content/uploads/test_script.php [L]
</IfModule>
你看到问题了吗?wp content/uploads/gravity_forms/*中的资源与test_script.php文件之间存在无限循环

我需要解决这个问题。从概念上讲,这听起来非常简单:我添加了一个新的Apache规则,如下所示:

RewriteCond %{HTTP_REFERER} /cmssystem46/wp-content/uploads/test_script.php
RewriteRule .* - [L] # i.e. don't do anything if the php script is redirecting back to this resource.
…但是这不起作用。非常感谢您的帮助

简要背景 我的任务是保护wp content/uploads/gravity_forms文件夹的安全,这样只有WordPress认证的用户才能访问其文件/媒体

Apache.htaccess重写规则(见上文)说,“对wp content/uploads/gravity_forms目录的任何HTTP请求都应该指向wp content/uploads/test_script.php文件进行处理。”

一旦用户访问test_scirpt.php文件,就会检查他们是否登录到WP,如果没有登录,就会被引导到WordPress登录屏幕。所有这些都有效

如果他们在WordPress中经过身份验证,他们将被重定向回他们试图请求的原始wp内容/上传/重力表单/*文件

这是对我上面粘贴的代码的解释


现在发生的事情是,PHP文件和ApacheHTAccess文件正在相互循环;我需要告诉Apache“如果刚刚调用wp content/uploads/gravity_forms/*的referer是test_script.php,请停止重定向过程”。。。这更有意义吗?

我不会将客户端重定向到其原始请求。我宁愿只提供脚本本身的文件,例如(部分来自)


这样,您就避免了重定向循环,一次到客户端的往返,并且更快地提供文件。

我不会将客户端重定向到其原始请求。我宁愿只提供脚本本身的文件,例如(部分来自)


这样,您就避免了重定向循环,一次到客户端的往返,并且更快地为文件提供服务。

那么您的
get\u site\u url()是什么呢$c
生成?可能你已经让php重定向了P->Q,然后你的htaccess用
Q->P
Hey Marc-get_site\u url()将其反弹回来。$c实际上是用户最初试图访问的url。因此,在我的本地主机上,文本url将是:
http://localhost/cmssystem46/wp-content/uploads/gravity_forms/
我应该清楚:在这些重定向过程中,用户浏览器的地址栏上的URL永远不会更改。这些都是内部重定向。你看。因为您的重写没有锚定,所以您可以在url中的任意位置匹配指定的字符串,该字符串将重写为您的.php url。然后,php url重定向回gravity_forms url,然后再次被mod_rewrite重定向,诸如此类。只有您的重写规则是内部的。PHP正在进行全面的客户端重定向。那么您的
get\u site\u url()是什么呢$c
生成?可能你已经让php重定向了P->Q,然后你的htaccess用
Q->P
Hey Marc-get_site\u url()将其反弹回来。$c实际上是用户最初试图访问的url。因此,在我的本地主机上,文本url将是:
http://localhost/cmssystem46/wp-content/uploads/gravity_forms/
我应该清楚:在这些重定向过程中,用户浏览器的地址栏上的URL永远不会更改。这些都是内部重定向。你看。因为您的重写没有锚定,所以您可以在url中的任意位置匹配指定的字符串,该字符串将重写为您的.php url。然后,php url重定向回gravity_forms url,然后再次被mod_rewrite重定向,诸如此类。只有您的重写规则是内部的。PHP正在做一个全面的客户端重定向。嘿,Olaf,谢谢-我应该在这里更新一下,我已经找到了一个解决方案,非常类似于您提出的解决方案。你的回答应该对任何可能遇到与我类似问题的人都有帮助。嘿,奥拉夫,谢谢-我应该在这里更新,我已经找到了一个解决方案,非常类似于你提出的方案。你的回答应该对任何可能遇到与我类似问题的人都有帮助。
RewriteCond %{HTTP_REFERER} /cmssystem46/wp-content/uploads/test_script.php
RewriteRule .* - [L] # i.e. don't do anything if the php script is redirecting back to this resource.
if (!is_user_logged_in()) {
    auth_redirect(); // THIS PART WORKS ALREADY
} else {
    $basedir = '/path/to/wp-content/uploads/gravity-forms/';
    $file = realpath($basedir . $_SERVER['REQUEST_URI']);
    if ($file === false || strpos($file, $basedir) !== 0 || !file_exists($file)) {
        // error
    } else {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($file).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        readfile($file);
        exit;
    }
}