Как добавить динамический sitemap.xml в приложение CFWheels?
Как настроить CFWheels для отображения следующего XML по адресу http://mydomain.com/sitemap.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>
Я удалил "sitemap.xml" из web.config
файл.
После этого я не уверен, что делать с созданием controller
а также view
, Должен ли я создать папку "sitemap.xml" в папке "views", затем добавить файл "index.cfm", а затем добавить вышеуказанный XML-файл?
Должен ли я создать файл "sitemap.xml.cfc" в папке "controllers"? А что должен содержать файл контроллера?
Должно ли это выглядеть примерно так?
<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>
Нужно ли добавлять запись в routs.cfm?
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")>
Затем вы можете загрузить URL на http://www.example.com/sitemap.xml
Если это не сработает, попробуйте это:
<cfset addRoute(pattern="sitemap.xml", controller="sitemap", action="index")>
<cfset addRoute(pattern="sitemap", controller="sitemap", action="index")>
Опять же, вы можете загрузить URL на http://www.example.com/sitemap.xml
Наконец, если это не сработает, удалите лишние строки из config/routes.cfm
и загрузите этот URL (который, безусловно, всегда будет работать независимо):
`http://www.example.com/sitemap?format=xml`.
Во-первых, вам нужно будет настроить свой веб-сервер на полное перезапись URL, если вы этого еще не сделали. Таким образом, вам не нужно будет иметь index.cfm в своем URL (http://mydomain.com/index.cfm/foo/bar становится http://mydomain.com/foo/bar).
Как только это будет сделано, измените ваш config/rout.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]
Возможно, вам придется перезагрузить / перезагрузить ваш веб-сервер. Но это должно сделать это.
редактировать
Одна последняя идея - вы можете добавить правило перезаписи в ваш веб-сервер, которое перенаправляет запросы на /sitemap.xml в / sitemap, так как вы знаете, что оно работает.