Apache2 无法调用wp内容下的WordPress插件文件

Apache2 无法调用wp内容下的WordPress插件文件,apache2,http-status-code-404,wordpress,httpd.conf,Apache2,Http Status Code 404,Wordpress,Httpd.conf,我有一个客户,他有很多博客客户。这些WordPress博客中的每一个都会调用一个提供产品链接的插件。链接的组成方式如下所示: add_action('init','hijackURL'); function hijack_URL() { $sURL = $_SERVER['REDIRECT_URL']; if (empty($sURL)) { $sURL = $_SERVER['REQUEST_URI']; } if (strpos(' ' . $sURL, '/ite

我有一个客户,他有很多博客客户。这些WordPress博客中的每一个都会调用一个提供产品链接的插件。链接的组成方式如下所示:

add_action('init','hijackURL');

function hijack_URL() {
  $sURL = $_SERVER['REDIRECT_URL'];
  if (empty($sURL)) {
    $sURL = $_SERVER['REQUEST_URI'];
  }
  if (strpos(' ' . $sURL, '/item/')>0) {
    $sID = str_replace('/item/','',$sURL);
    $sID = trim($sID);
    if (empty($sID)) {
      require('../../../wp-blog-header.php');
      $sBlogURL = get_bloginfo('wpurl');
      header('HTTP/1.1 302 Moved Temporarily');
      header("Location: $sBlogURL");    
      exit(0);
    }
    $sID = pack('H*', $sID);
    $sURL = gzuncompress($sID);
    header('HTTP/1.1 302 Moved Temporarily');
    header("Location: $sURL");  
    exit(0);
  }
}
{website}/wp content/plugins/prodx/product?id=432320

这在除两个博客外的所有博客上都很有效。在这两种情况下,当您尝试调用URL时,会得到404

因此,我禁用了除prodx之外的所有插件,并将主题恢复为默认主题(Kubrick),我认为可能是一个带有add_action()API的插件拦截在执行此操作,例如拦截URL并重定向它们。然而,这没有帮助

所以,我把WordPress升级到了最新版本。再说一次,我没修好

所以,我检查了权限,并与一个运行良好的博客进行了比较。再说一次,我没修好

所以我用一个工作博客中的.htaccess替换了.htaccess。再说一次,我没修好

因此,我使用与此相同的工作日志中的一些文件替换了所有文件,然后恢复了wp-config.php文件,以便它与正确的日志数据库通信。再说一次,我没修好

我再一次仔细检查了权限,与一个运行良好的博客相比。再说一次,我没修好

因此,我创建了一个test.php,如下所示:

<?php

print_r($_GET);
echo "hello world";

您可以使用phpmyadmin(并比较每个博客选项的其他方面)检查WP options表中插件选项中的坏URL,该选项可能已经在您的主机上可用,或者作为插件:。或者使用干净的选项删除插件的选项以完全“重置”插件(如果插件使用选项):

我认为问题在于URL太长。以下是一些关于这方面的重要信息:

出于某种原因,该博客得到的是404而不是413

修复方法是我使用gzcompress来缩短我的长产品ID(这是一个隐藏的URL),然后使用bin2hex。因此,我将URL设置为:

从那里,我让我的插件添加了一个init处理程序来劫持URL、检查它并重定向。该函数如下所示:

add_action('init','hijackURL');

function hijack_URL() {
  $sURL = $_SERVER['REDIRECT_URL'];
  if (empty($sURL)) {
    $sURL = $_SERVER['REQUEST_URI'];
  }
  if (strpos(' ' . $sURL, '/item/')>0) {
    $sID = str_replace('/item/','',$sURL);
    $sID = trim($sID);
    if (empty($sID)) {
      require('../../../wp-blog-header.php');
      $sBlogURL = get_bloginfo('wpurl');
      header('HTTP/1.1 302 Moved Temporarily');
      header("Location: $sBlogURL");    
      exit(0);
    }
    $sID = pack('H*', $sID);
    $sURL = gzuncompress($sID);
    header('HTTP/1.1 302 Moved Temporarily');
    header("Location: $sURL");  
    exit(0);
  }
}

您应该查看服务器的错误日志,应该有一个解释。如果没有,打开调试级别等。也就是说,插件确实不应该链接到插件目录中的文件,它应该使用wordpress重写类

谢谢,我会试一试并让你知道。我在想有什么东西在重写规则中添加了一个过滤器或操作(这在WordPress中是可能的),这就是为什么我会这样做。我发现wp_重写API实际上相当复杂。他们建议您在激活和停用期间运行它,但不幸的是,我无法对已经运行的博客执行此操作。因此,我使用了下面的hijack_URL()技术,这更容易使用。