我是JS的绝对初学者。
1)我正在尝试做什么:
我的网页由index.php组成,对于目录的所有文件和一组content.inc都是相同的,如下所示:index.php?open = content.inc。这是通过index.php中的PHP片段完成的,并且效果很好。 但是,Google将所有content.inc文件编入索引。然后用户的浏览器显示content.inc而不使用框架index.php。这是我想避免的。因此,我在每个content.inc的开头添加一个适度的脚本(我会在运行后将其转换为函数)告诉浏览器,而不是显示content.inc,它应该显示index.php?open = content。 INC。
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的投诉进入无限循环;但没有一个符合我的情况。但是,我很感激地接受一个有用的链接作为答案。答案 0 :(得分:0)
对于初学者,此行中有错误:
if (filename.indexOf("index.php") = -1)
这是一项作业,并且总是评估为true
,您需要使用==
或===
(这应该更高效)。
答案 1 :(得分:0)
您的测试案例中有罪(见JP de la Torre的回答)。为了改进,这里有一个片段来演示如何使用正则表达式分析网址:
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文件请求。
答案 2 :(得分:0)
包含单独调用的INC文件的问题的解决方案是Bertrand在上面的第二个代码片段中提出的解决方案。它预先假定(正确地)在替换中省略了inc扩展名。
正如我上面所报道的,如果Firefox直接打开PHP文件,即没有涉及本地主机(带有php模块),Firefox可能会进入无限循环。