3

我们正在向我们的 CMS 添加一些功能,当用户创建一个页面时,他们可以选择一个选项来允许/禁止该页面的搜索引擎索引。

如果他们选择是,那么将适用以下内容:

<cfif request.variables.indexable eq 0>
<cffile 
    action = "append"
    file = "C:\websites\robots.txt"
    output = "Disallow: /blocked-page.cfm"
    addNewLine = "yes">
<cfelse>
<!-- check if page already disallowed in robots.txt and remove line if it does --->
</cfif>

这是<cfelse>我需要帮助的条款。解析 robots.txt 以查看此页面是否已被禁止的最佳方法是什么?会是 cffile action="read",然后对 read 变量执行 find() 吗?

实际上,对页面是否已经被禁止的检查可能会更进一步,以避免双重添加。

4

3 回答 3

4

您将页面列表保存在数据库中,并且每个页面记录都有indexable一点,对吗?如果是,则更简单、更可靠的方法是在每次添加/删除/更改可索引位时生成新的 robots.txt。

<!--- TODO: query for indexable pages ---->

<!--- lock the code to prevent concurrent changes --->

<cflock name="robots.txt" type="exclusive" timeout="30">

    <!--- flush the file, or simply start with writing something --->

    <cffile 
        action = "write"
        file = "C:\websites\robots.txt"
        output = "Sitemap: http://www.mywebsite.tld/sitemap.xml"
        addNewLine = "yes">

    <!--- append indexable entry to the file --->

    <cfloop query="getPages">

        <!--- we assume that page names are not entered by user (= safe names) --->

        <cffile 
            action = "append"
            file = "C:\websites\robots.txt"
            output = "Disallow: /#getPages.name#.cfm"
            addNewLine = "yes">

    </cfloop>

</cflock>

示例代码未经测试,请注意拼写错误/错误。

于 2012-09-04T06:13:36.500 回答
2

为此目的使用 Robots.txt 文件是个坏主意。 Robots.txt 不是一种安全措施,您正在向“邪恶者”提供您不想编入索引的页面列表。

您最好使用robots 元标记,它不会向任何人提供您不希望编入索引的页面列表,并让您更好地控制机器人可以执行的各个操作。

使用元标记,您可以像往常一样在生成页面时简单地输出标记。

于 2012-09-04T08:54:29.780 回答
1
<!--- dummy page to block --->
<cfset request.pageToBlock = "/blocked-page.cfm" />

<!--- read in current robots.txt --->
<cffile action="read" file="#expandPath('robots.txt')#" variable="data" />
<!--- build a struct of all blocked pages --->
<cfset pages = {} />
<cfloop list="#data#" delimiters="#chr(10)#" index="i">
    <cfset pages[listLast(i,' ')] = '' />
</cfloop>


<cfif request.variables.indexable eq 0>
    <!--- If the page is not yet blocked add it --->
    <cfif not structKeyExists(pages,pageToBlock)>
        <cffile action="append" file="C:\websites\robots.txt" 
             output="Disallow: #request.pageToBLock#" addNewLine="yes" />
        <!--- not sure if this is in a loop but if it is add it to the struct for nex iteration --->
        <cfset pages[request.pageToBlock] = '' />
    </cfif>
</cfif>

这应该这样做。读入文件,循环它并构建阻塞页面的结构。仅在尚未被阻止的情况下添加新页面。

于 2012-09-04T05:07:39.663 回答