如何从wp-content/ploads/.*抓取查询字符串

时间:2021-11-10 作者:philolegein

我编写了一个快速的小插件,可以获取一些自定义query\\u变量,进行一些操作,并将输出存储在CSV文件中。它对页面和帖子非常有用,但是。。。似乎对wp内容/上传的查询实际上并没有通过WordPress,我也想抓住这些。

我在考虑两种不同的方法:

根据this question, 可以编写自定义重写规则,并将请求传递到WordPress iff,这是对wp内容/上载的查询,并且存在一个查询字符串;或

编写一个独立的PHP程序来处理来自自定义重写规则的请求,而无需担心WordPress的崩溃。

(1)的问题是。。。互联网是一个疯狂而古怪的地方。虽然我认为没有查询字符串的wp内容/上传内容的请求会比使用查询字符串的请求少得多,但最终可能会给服务器带来大量额外负载,这取决于野外发生的情况。

(2)的问题是,我必须找出wp_upload_dirplugin_dir_path 如果没有wordpress,或者我必须坚持wordpress层次结构之外的所有内容。

目前,我可以做后者,因为这只是对我的一个网站的一个快速的小技巧,但是。。。感觉很不对。有没有更好的方法?

1 个回复
最合适的回答,由SO网友:Andrea Somovigo 整理而成

正如您所指出的,问题在于。htaccess重写规则,在典型的wp htaccess文件中,该规则将物理文件和目录排除在索引处理之外。php并直接获得服务。我认为解决办法在于与合作。htaccess添加了一个优先规则,让带有查询字符串的文件由php处理,而不是直接提供,并释放查询字符串。我不认为这样的规则(仅限于特定情况)可能会使服务器过载,您可以轻松地监视它并决定是否使用它:在您的中尝试这个。htaccess:

#first condition if the URL contains the path to uploads directories
RewriteCond %{REQUEST_URI}  /wp-content/uploads/ [NC] 

#second condition if specific keys are present in the query string (attr1 OR attr2)
RewriteCond %{QUERY_STRING} attr1= [OR]
RewriteCond %{QUERY_STRING} attr2=

#third condition we need to avoid infinite loop and errror 500, 
#so we check that a specific key (added in our final rewrite rule below) is not present 
RewriteCond %{QUERY_STRING} !loop=no

#the final rule if all above is matched will redirect to index.php and add our \'loop=no\' key/value pair to avoid the loop
RewriteRule ^ /index.php?loop=no [L,QSA] 
此时,如果键入url/wp-content/uploads/2012/10/img.png?attr1=foo&attr2=bar 您将得到404未找到。在插件函数中,然后:

add_action(\'init\',\'check_attributes\');
function check_attributes(){
  if(!empty($_GET[\'loop\']) && $_GET[\'loop\'] ==\'no\'){ //you may add more clause here if needed

    $var1=$_GET[\'attr1\'];
    $var2=$_GET[\'attr2\'];
    // perform your logic with the variables passed to the url
   
    // maybe redirect to the physical file without query vars?
    wp_redirect(strtok($_SERVER["REQUEST_URI"], \'?\'));
    exit;
  }
}
希望能有所帮助

相关推荐