Php 修复ApacheInifinte循环-确定引用器
我有以下Apache配置设置: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
<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;
}
}