2

如何配置 CFWheels 以在http://mydomain.com/sitemap.xml显示以下 XML ?

<?xml version="1.0" encoding="UTF-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

      <-- I'll add the <url> tags dynamically here later -->
</urlset>

我已经从web.config文件中删除了“sitemap.xml”。

在此之后,我不确定如何创建controllerand view。我是否应该在“views”文件夹中创建一个“sitemap.xml”文件夹,然后添加一个“index.cfm”文件,然后添加上面的 XML?

我应该在“controllers”文件夹中创建一个“sitemap.xml.cfc”文件吗?控制器文件应该包含什么?

它应该看起来像这样吗?

<cfcomponent extends="Controller" output="false">
<cfscript>  
  function init(){
    // Let CFWheels know what type of output this controller can 'provide'
    provides("xml");
  }

  function index(){

  }
</cfscript>
</cfcomponent>

我需要在 routes.cfm 中添加一个条目吗?

4

2 回答 2

2

设置控制器

你的控制器的index()方法应该是这样的。它存储在controllers/Sitemap.cfc.

function init() {
    // Grab data about URLs from model or build an array of structs to pass to the view
    urls = model("page").findAll(); // This line is just an example

    // Call `renderWith()` to instruct Wheels that this requires a special content-type
    renderWith(urls);
}

设置视图

然后您的视图views/sitemap/index.xml.cfm可以生成所需的 XML:

<cfoutput>

<?xml version="1.0" encoding="UTF-8"?>
<urlset
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
        http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

    #includePartial(partial="url.xml", query=urls)#
</urlset>

</cfoutput>

然后,您可以views/sitemap/_url.xml.cfm在查询或数组中实现一个表示单个项目的部分。如果您使用的不是查询,请告诉我,我可以修改上面的示例。

<cfoutput>

<url>
    <loc>#arguments.uri#</loc>
    <loc>#arguments.updatedAt#</loc>
</url>

</cfoutput>

请记住,当您使用这样的部分时,查询列或结构键会被放置到arguments范围中,这就是我在虚构示例中引用arguments.uri的原因。arguments.updatedAt

通过 URL 访问

根据您服务器的 URL 重写功能,您可能需要尝试几件事来让 URL 执行您想要的操作。

你也许可以在config/routes.cfm(但我只在 Apache 上测试过)做这样的事情:

<cfset addRoute(pattern="sitemap.[format]", controller="sitemap", action="index")>
<cfset addRoute(pattern="sitemap", controller="sitemap", action="index")>

然后您可以在以下位置加载 URLhttp://www.example.com/sitemap.xml

如果这不起作用,请尝试以下操作:

<cfset addRoute(pattern="sitemap.xml", controller="sitemap", action="index")>
<cfset addRoute(pattern="sitemap", controller="sitemap", action="index")>

同样,您可以在以下位置加载 URLhttp://www.example.com/sitemap.xml

最后,如果这不起作用,请删除多余的行config/routes.cfm并加载此 URL(无论如何,它肯定会始终有效):

`http://www.example.com/sitemap?format=xml`.
于 2012-01-31T19:17:24.077 回答
1

首先,您必须配置您的网络服务器以执行完整的 URL 重写,如果您还没有的话。这样您就不必在 URL 中包含 index.cfm (http://mydomain.com/index.cfm/foo/bar 变为http://mydomain.com/foo/bar)。

一旦到位,修改您的 config/routes.cfm 如下:

<cfset addRoute(name="sitemap",
        pattern="/sitemap.xml",
        controller="sitemap",
        action="list") />

然后您可以在此处添加您的 XML 代码:

/views/sitemap/list.cfm

并且,在这里可以选择一个控制器:

/controllers/Sitemap.cfc(带有名为 list 的函数)

编辑

由于上述操作不太正确,我查看了 CFWheels 附带的股票重写规则,并注意到一个大问题:

RewriteCond %{REQUEST_URI} !^.*/(flex2gateway|jrunscripts|cfide|cfformgateway|cffileservlet|railo-context|files|images|javascripts|miscellaneous|stylesheets|robots.txt|sitemap.xml|rewrite.cfm|favicon.ico)($|/.*$) [NC]

注意“sitemap.xml”。从您的列表中删除它,留下这个:

RewriteCond %{REQUEST_URI} !^.*/(flex2gateway|jrunscripts|cfide|cfformgateway|cffileservlet|railo-context|files|images|javascripts|miscellaneous|stylesheets|robots.txt|rewrite.cfm|favicon.ico)($|/.*$) [NC]

您可能需要重新启动/重新加载您的 Web 服务器。但这应该这样做。

编辑

最后一个想法 - 你可以在你的网络服务器中添加一个重写规则,将 /sitemap.xml 的请求重定向到 /sitemap,因为你知道一个有效。

于 2012-01-30T22:52:00.827 回答