带有查询字符串的php文件的Ajax查询导致404

时间:2010-09-24 22:54:10

标签: php jquery http-status-code-404

如果您想重新创建错误,请访问www.tlcnz.com,然后点击标头下方水平菜单中的“与我们联系”链接。为了不完全不起作用的网站的利益,我已经完全从所有其他链接中删除了查询字符串,并将其替换为每个链接的单个文件 - 除了指向联系表单的链接。我确实需要一个通用的解决方案,用于menu.swf文件使用的一些功能。此外,它曾经是美好而优雅的。这一切都曾经奏效......我对如何设法打破它感到困惑。

My Javascript is here。这是我正在使用的PHP。这是一个bloader.php,其中Ajax以404上的方式返回

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
<?PHP require_once('blog/wp-blog-header.php');?>
<?PHP 
 $name = $_GET['name'];
query_posts('pagename='.$name);while (have_posts()): the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php the_content(''); ?>
<?php endwhile; ?>

这是about.php,它有效,并且完全相同。它只是不需要查询字符串。

<?PHP require_once('blog/wp-blog-header.php'); ?>
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
<?PHP $name = "about";
query_posts('pagename='.$name);while (have_posts()): the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php the_content(''); ?>
<?php endwhile; ?>

3 个答案:

答案 0 :(得分:1)

我解决了。这是变量的名称。我猜我最近升级的wordpress(<?PHP require_once('blog/wp-blog-header.php');?>以某种方式使得特定的变量名称在包含在查询字符串中时抛出404.整个事情有点巫术但是

答案 1 :(得分:0)

不确定这是否相关或原始版本是否相同:require_once('blog/wp-blog-header.php');输出任何内容(包括空行)吗?

必须在任何输出之前调用

header()。

答案 2 :(得分:0)

变量的新名称是什么?您使用的是jQuery或MooTools等JS框架吗?

这里的问题几乎相同,但我想这是由于变量值而不是名称。 让我解释: 我正在使用自定义模板文件进行Ajax包含(并加载wp-blog-header.php)作为 bloader.php

Javascript检测内部链接(这确保了JS未被激活时的兼容性)并转换这些URL以使它们指向加载php,如下所示:

var BlogURL = "http://www.domain.com";
var TemplateURL = "http://www.domain.com/wp/wp-content/themes/mytheme";
if(PassedUrl.indexOf("?page_id=") != -1) {
                        AjaxUrl = PassedUrl.replace(BlogURL + "/?page_id=",TemplateURL + "/pagecontent.php?pageid="); 
                        }
                        else {
                        AjaxUrl = PassedUrl.replace(BlogURL + "/",TemplateURL + "/pagecontent.php?pagename="); 
                        }

然后pagecontent.php处理URL查询字符串变量以捕获要包含的内容:

<?PHP define('WP_USE_THEMES', false);
$wp_blogheader = ("../../../wp-blog-header.php");
require_once($wp_blogheader);
if(isset($_GET['pageid'])) {
    $pag = $_GET['pageid'];
}
elseif(isset($_GET['pagename'])) {
    $pag = $_GET['pagename'];
}

global $post;

// TRANSLATION FUNCTIONS OMITTED

if(isset($_GET['p'])) {
    $page_data = get_post( $pag );
}
if(isset($_GET['pageid'])) {
    $page_data = get_page( $pag );
}
elseif(isset($_GET['pagename'])) {
    if(function_exists('qTranslateSlug_get_page_by_path')) {
    $pag = qTranslateSlug_get_page_by_path($pag, $q_config['language']);
    $page_data = get_page( $pag );}
    else {    $page_data = get_page_by_path( $pag );}
}

$content = $page_data->post_content; // Get Content
$title = $page_data->post_title; // Get title
echo do_shortcode($content);
?>

由于我正在使用qTranslate插件在任何页面中提供多种语言内容,因此必须检查某些功能。 这就是我收到404错误的地方。 基本上,翻译函数从页面名称变量中剥离语言代码,在URL字符串中传递,以获取默认页面(唯一真正存在的页面)。因此,该语言代码存储并应用于php,以通过适当的语言过滤内容(因为在pagecontent.php中它从默认开始)。

所以当Ajax调用的URL是 www.domain.com/wp/wp-content/themes/mytheme/pagecontent.php?pagename= my_page / my_subpage 它有效吗

但是什么时候 www.domain.com/wp/wp-content/themes/mytheme/pagecontent.php?pagename= en / my_page / my_subpage 它会抛出404错误,不会显示任何内容。

经过一些调试测试后,唯一的区别是URL中的变量值,即翻译函数的$pag = $_GET['pagename'];输入。实际上,输出(在DB查询之前)是相同的,根据函数的用途应该是正确的。

最奇怪的是,Firebug控制台显示404(如服务器访问日志),但响应原始内容和html标签打印正确的页面! 此外,当在另一个窗口中打开www.domain.com/wp/wp-content/themes/mytheme/pagecontent.php?pagename= en / my_page / my_subpage 时,它会显示(log html status 200 ,而不是404)。显然,将变量“pagename”更改为“page_name”无效。

在升级到WP 3.0.1之前,所有以前都工作正常,这让我认为我的Javascript和我的自定义包含/翻译php仍然是正确的,新WP版本中的某些内容可以预先解析自定义查询字符串并根据其默认页面条件阻止它。

但是,我仍然无法弄清楚如何以及在哪种情况下php问题/拼写错误导致XMLHttpRequest的404.