【问题标题】:Browser does not replace an include file by its including file浏览器不会用包含文件替换包含文件
【发布时间】:2018-05-17 15:47:42
【问题描述】:

我是 JS 的绝对初学者。

1) 我正在尝试做的事情:

我的网页由 index.php 组成,该 index.php 对于目录中的所有文件和一组 content.inc 中的一个文件都是相同的,例如:index.php?open=content.inc。这是由 index.php 中的 PHP sn-p 完成的,并且运行良好。 但是,Google 会索引所有 content.inc 文件。然后,用户的浏览器会显示 content.inc 而没有框架 index.php。这是我想避免的。因此,我在每个 content.inc 的开头添加了一个适度的脚本(一旦它运行,我将转换为一个函数)来告诉浏览器,而不是显示 content.inc,它应该显示 index.php?open=content。公司。

2)我不可行的解决方案:

var url = window.location.pathname;
var filename = url.substring(url.lastIndexOf('/')+1);
if (filename.indexOf("index.php") = -1)
    { var frame_name = "index.php?open="+filename;
        window.location.replace(frame_name);
     };

浏览器 (Firefox 60) 会忽略这一点;它显示 content.inc。 (我也有这个脚本的版本,可以让浏览器进入无限循环。)

这里有什么问题?请帮忙!

PS:请放心,我已经对这个问题进行了广泛的网络搜索,并发现了很多关于 location.replace 进入无限循环的投诉页面;但没有一个符合我的情况。不过,我很感激接受一个有用的链接作为答案。

【问题讨论】:

    标签: javascript methods


    【解决方案1】:

    对于初学者,您在此行中有一个错误:

    if (filename.indexOf("index.php") = -1)
    

    这是一个分配,并且总是评估为true,您需要使用== 或===(应该更高效)。

    【讨论】:

    • 很抱歉给您带来了一个愚蠢的错误。我可能会补充一点,我曾尝试在控制台上使用 Mozilla 的调试器。但是,由于上面的 == 错误更正后的代码版本进入了无限循环,我每次尝试脚本时都必须杀死 Firefox,结果是我永远看不到调试报告。您碰巧知道解决此类问题的任何方法吗?
    【解决方案2】:

    你的测试用例有罪(见 JP de la Torre 的回答)。为了改进,这里有一个 sn-p 来演示如何使用正则表达式分析 url:

    function redirect(url) {
      if(url && url.indexOf('.inc') >= 0) {
        return url.replace(/\/(\w+)\.inc/, '/index.php?open=$1');
      }
      return url;
    }
    
    let urls = [
      window.location.href,
      'http://google.fr',
      'http://example.com/index.php?open=wazaa',
      'http://example.com/wazza.inc'
    ];
    
    urls.forEach(url => {
      console.log(url, ' => ', redirect(url));
    });

    正则表达式将捕获 / 和 .inc 之间的任何文本。然后您可以将其用作 $1 的替换值。

    应用到您的案例中,您只需要:

     if(window.location.href.indexOf('.inc') >= 0) {
        window.location.href = window.location.href.replace(/\/(\w+)\.inc/, '/index.php?open=$1');
      }
    

    如果启用了 mod_rewrite,您还可以使用 .htaccess 服务器端重定向对 index.php 上 .inc 文件的请求。

    【讨论】:

    • 原则上,这是一个优雅的解决方案。但是,它会使 Firefox 陷入无限循环。我的诊断如下:如果我很好地理解了正则表达式,那么您替换的 url 似乎遗漏了 content.inc 的“.inc”部分。这对 index.php 中的 php 代码来说很好,它将 content.inc 填充到某个 HTML 块中,因为此代码将 'content' 完成为 'content.inc' [看来您已经看到了吗?]。然而,由于某种神秘的原因,如此构造的文件再次满足了替换的输入条件,因此再次执行。再次,不知道该怎么做。
    • 该脚本将检测任何带有 .inc 的请求并重定向到 index.php。如果它进入无限循环,则意味着浏览器一次又一次地在 url 中找到 .inc 字符串。您是否有测试服务器或发布您的 index.php 代码?
    • 我同时找到了错误的根源:当我从本地主机调用 content.inc 时,一切正常。相反,我在测试阶段所做的是双击文件 content.inc。这会直接调用 Firefox,跳过本地服务器。使用 index.php 直接调用 Firefox 会使其进入循环(无论出于何种原因)。原来的问题就这样解决了;谢谢你。以防万一其他人可能对解决方案感兴趣,我可以发布这两个文件的相关部分。但是,它们不适合这个盒子;而且我看不到在此处附加它们的选项。
    • 恐怕我听不懂。如果我从我的问题中消除我的错误并解释如何不运行测试,那么接下来的大部分对话,包括你的有用提示都会变得不重要。
    • 您可以: - 通过附加 EDIT 部分来编辑您的问题,并在之前保留原始文本 - 例如: EDIT ------------------ -------------------------- 问题不仅是由脚本失败引起的(谢谢 JP de la Torre && Bertrand),而且我也是调用我的 inc 文件... - 回答你自己的问题 在这两种情况下,你都可以参考另一个答案来给予一些学分。您也可以按原样离开并接受两个答案之一或投票。
    【解决方案3】:

    包含单独调用的INC文件问题的解决方案是Bertrand在上面的第二个代码sn-p中提出的解决方案。它假定(正确地)在替换中省略了 inc 扩展名。

    正如我上面所报道的,如果 Firefox 直接打开一个 PHP 文件,即不涉及本地主机(及其 php 模块),它可能会陷入死循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2023-03-24
      • 2017-05-14
      • 2018-02-28
      • 2011-08-02
      相关资源
      最近更新 更多