有点奇怪的是,我有一个PHP文件有时会出现404错误。这是我制作的wordpress插件的ajax回调页面。
例如:
显然PHP文件存在或第一个链接不起作用,为什么第二个链接不起作用?
有趣的是,使用完全相同的代码,麻烦的链接在我的服务器上正常工作:http://petewilliams.info/blog2/wp-content/plugins/amazon-affiliate-link-localizer/ajax.php?strAction=search&strLink=http://www.amazon.com/dp/B000IZGIA8
遗憾的是,我无法直接访问遇到问题的服务器,但我可以要求进行更改。不只是这个网站出现问题,脚本的其他一些用户也遇到了同样的问题。
这是该文件的源代码,没有太多内容:
<?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";
}
任何人对于什么事都有任何想法?
由于
皮特
答案 0 :(得分:1)
这两个URL在您的脚本中执行不同的代码路径,因为运行checkLinks
功能的路径运行searchLink
无法运行searchLink
。
因此,您可以假设服务器上的某些设置不允许file_get_contents
中使用某些功能。
我的直接怀疑是查看{{1}}
中使用的文件访问权限答案 1 :(得分:1)
代码看起来不错。看起来代码正在调用searchLink(),并尝试确定是否使用dom中的规范引用中可用的url,(<link rel="canonical" href="https://rads.stackoverflow.com/amzn/click/com/B000IZGIA8" rel="nofollow noreferrer" />
)或url中传递的链接。
我认为你最好的办法是在服务器上拖拽php错误日志,看看正在记录哪些错误。如果您具有对服务器的shell访问权限,则可以发出以下命令:
php -i | fgrep error_log # this will give you the location of the error file
tail -f /path/to/error/log
现在您正在查找错误日志,运行相同的脚本并查看记录的内容。
- 编辑 -
很抱歉没有看到您无法访问生产服务器的部分。也许在您的开发服务器上拖尾错误日志,即使脚本可能看起来有效,它仍然可能在后台记录一些信息。
答案 2 :(得分:0)
您的网址重写错误,这不是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
似乎/
(甚至在urlencoded中)作为重写的一部分被考虑在内,
检查您的重写(.htaccess或在apache配置中,或者如果您使用的是PHP脚本)