为什么一个已知的PHP文件会给出404?

为什么一个已知的PHP文件会给出404?,php,javascript,ajax,wordpress,http-status-code-404,Php,Javascript,Ajax,Wordpress,Http Status Code 404,这有点奇怪,我有一个PHP文件,有时会出现404错误。这是我制作的wordpress插件的ajax回调页面 例如: 这项工作: 但这并不是: 显然PHP文件在那里,或者第一个链接不起作用,那么为什么第二个链接不起作用呢 有趣的是,这个麻烦的链接在我的服务器上使用完全相同的代码工作正常: 遗憾的是,我无法直接访问出现问题的服务器,但我可以要求进行更改。不仅仅是这个网站有问题,脚本的其他一些用户也有同样的问题 以下是该文件的源代码,内容不多: <?php header("Content-ty

这有点奇怪,我有一个PHP文件,有时会出现404错误。这是我制作的wordpress插件的ajax回调页面

例如:

这项工作:

但这并不是:

显然PHP文件在那里,或者第一个链接不起作用,那么为什么第二个链接不起作用呢

有趣的是,这个麻烦的链接在我的服务器上使用完全相同的代码工作正常:

遗憾的是,我无法直接访问出现问题的服务器,但我可以要求进行更改。不仅仅是这个网站有问题,脚本的其他一些用户也有同样的问题

以下是该文件的源代码,内容不多:

<?php

header("Content-type: application/javascript");

switch ( $_REQUEST['strAction'] ) {
    case 'search':
        searchLink();
        break;
    case 'version':
        echo "1.7b";
        break;
    default:
        checkLinks();
        break;
}

function checkLinks() {

    // get URL
    $strTld         = $_REQUEST['strTld'];
    $strAffiliateId = $_REQUEST['strAffiliateId'];
    $strLinks       = $_REQUEST['strLinks'];
    $arrLinks       = explode( '|', $strLinks );

    foreach ( $arrLinks as $strAsin ) {

        $strLink = "http://www.amazon.$strTld/exec/obidos/ASIN/$strAsin/$strAffiliateId";

        $arrHeaders = get_headers($strLink, 1);

        // if not found, then search for it
        if ( strpos( $arrHeaders[0], '404' ) || strpos( $arrHeaders[1], '404' ) ) {
            echo "arrLinksToCheck[ '$strAsin' ].searchLink();\n";
        } else {
            echo "arrLinksToCheck[ '$strAsin' ].localiseLink();\n";
        }

    }
}

function searchLink() {
        $strHtml = file_get_contents( $_REQUEST['strLink'], false, null, -1, 100000 );

        $strPattern = '/canonical" href="http:\/\/(.*)\/(.*)\/dp\/([A-Z0-9]{10})/';

        preg_match( $strPattern, $strHtml, $arrMatches );
        $strTitle = str_replace(  '-', '%20', $arrMatches[2] );

        // the canonical ASIN is sometimes different to the original one which confuses the JS, so use the one in the original link
        $strPattern2 = '/\/([A-Z0-9]{10})/';
        preg_match( $strPattern2 , $_REQUEST['strLink'], $arrUrlMatches );

        $strAsin = is_array( $arrUrlMatches ) ? $arrUrlMatches[1] : $arrMatches[3];

        echo "arrLinksToCheck[ '{$strAsin}' ].writeSearchLink( '$strTitle' );\n";

}

这两个URL在脚本中执行不同的代码路径,作为有效的URL运行
检查链接
功能,作为无效的URL运行
搜索链接

因此,您可以假设服务器上的某些设置不允许在
searchLink
中使用某些功能


我的直接怀疑是查看
文件获取内容中使用的文件访问权限

代码看起来正常。看起来代码正在调用searchLink(),并尝试确定是使用dom中规范引用中可用的url(
),还是使用url中传递的链接

我认为最好的办法是跟踪服务器上的php错误日志,看看记录了哪些错误。如果您具有服务器的shell访问权限,则可以发出以下命令:

 php -i | fgrep error_log # this will give you the location of the error file

 tail -f /path/to/error/log
现在您正在跟踪错误日志,运行相同的脚本并查看正在记录的内容

--编辑--


抱歉,没有看到您无权访问生产服务器的部分。可能会跟踪开发服务器上的错误日志,即使脚本看起来正常,但它仍可能在后台记录一些信息。

您的URL重写错误,这不是404:-

ajax.php?strAction=search&strLink=www.amazon.com
但这些将影响404:

ajax.php?strAction=search&strLink=http://www.amazon.com
ajax.php?strAction=search&strLink=http%3A%2F%2Fwww.amazon.com
在重写过程中,
签出您的重写(.htaccess或在apache配置中,或者如果您使用的是PHP脚本)