【问题标题】:Ajax query on php file with query string causes 404带有查询字符串的 php 文件的 Ajax 查询导致 404
【发布时间】:2011-04-17 00:51:31
【问题描述】:

如果您想重现错误,请访问 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; ?>

【问题讨论】:

  • 您忘记了指向您的 JS 的链接...不过,最好将其粘贴到您的帖子中。请记住只粘贴重要部分,并删除不相关的内容。
  • 您使用的是哪个链接?您可能在将 get 粘贴到 url 时做错了。
  • 我已经发布了 javascript,可在此处访问 tlcnz.com/scripts.js。我知道什么是 404 错误,文件都在那里。如果您从“联系我们”部分复制链接位置并将其粘贴到浏览器中,您会看到它可以正常工作,而且如果我禁用查询字符串,它也可以正常工作。

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


【解决方案1】:

我解决了。它是变量的名称。我猜我最近升级的 wordpress(即 &lt;?PHP require_once('blog/wp-blog-header.php');?&gt; 不知何故使该特定变量名在包含在查询字符串中时抛出 404。不过,整个事情有点巫术

【讨论】:

    【解决方案2】:

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

    header() 必须在任何输出之前调用。

    【讨论】:

    • 在将内容动态加载到现有元素中时仍然是这种情况吗?此外,我需要在所有其他 php 文件上使用相同的文件,没有查询字符串并且没有错误
    【解决方案3】:

    变量的新名称是什么?你使用的是 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。

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多