Создание sitemap с пагинацией и генерация элементов robots.txt

Введение

В этой статье разберем как создать постраничный sitemap, который хранится статично в таблице БД (это лучше чем делать тяжелую генерацию всех страниц на лету). 

Есть пакет SQL с кодом editorPages_seo, который содержит все необходимые изменения по генерации sitemap и robots (в панели управления это будет страница /seo).

Генерация Sitemap

Таблица БД для sitemap - as_sitemap(loc, lastmod, changefreq, priority, updated)

Есть процедура falcon_sitemap, которая генерирует состав sitemap (она чистит as_sitemap и потом записывает новые строки в sitemap). Примеры процедуры: 

CREATE PROCEDURE [dbo].[falcon_sitemap]
  @parameters DictionaryParameter READONLY,  -- as_domain - передача домена
  @s nvarchar(max) output	
AS
BEGIN
	
	declare @result table(loc nvarchar(max) ,lastmod date, changefreq nvarchar(24)  , priority nvarchar(10) )

	insert into @result
	SELECT	top 1000  
			 iif(code='_default', '', '/'+code) loc, 
			modified lastmod, 
			'monthly' changefreq,  
			'0.8' priority
	FROM pg_pages
	WHERE isInMenu = 1 AND role = 'all' or code='_default'

	insert into @result
	SELECT	top 1000  
			'/'+ code loc, 
			modified lastmod, 
			'monthly' changefreq,  
			'0.1' priority
	FROM pg_pages
	WHERE  code<>'_default'


	delete from as_sitemap 
    
    insert into as_sitemap(loc, lastmod, changefreq, priority, updated)
    select loc, lastmod, changefreq, priority, getdate()
    from @result

	set @s=''    
END

Есть форма-кнопка generatesitemap, которая пересобирает sitemap. Ее saveItem:

CREATE PROCEDURE [dbo].[fm_generatesitemap_saveItem]
   @username nvarchar(256), 
   @itemID int,
   @parameters ExtendedDictionaryParameter readonly
AS
BEGIN
	declare @s nvarchar(max) = ''
	declare @ps DictionaryParameter
    insert into @ps ([Key], Value)
    select 'as_domain', Value2 from @parameters  where [key]='domain'
    
 	
	exec falcon_sitemap @parameters = @ps, @s = @s output
    
    declare @cnt int = isnull((select count(*) from as_sitemap),0)
    
	-- SELECT 1
	select 1 Result, 'Sitemap сгенерирован ('+cast(@cnt as nvarchar)+' шт.)' Msg, '' SuccessUrl, 1 HideFormAfterSubmit, '' RefreshContainer, 1 EnableSaveAlert
END

Сама генерация sitemap.xml происходит на /rsfiletypes, где для типа sitemap надо реализовать такую процедуру: 

CREATE PROCEDURE [dbo].[rs_sitemap_getFile]
	@urlParameters DictionaryParameter READONLY,
	@username nvarchar(32),
	@langID int = 0
AS
BEGIN	
	declare @domain nvarchar(128) = (select Value  from @urlParameters where [Key] = 'as_domain')
    
    declare @page int = isnull((select try_cast(Value as int) from @urlParameters where [Key] = 'page'), 1)
    declare @pageSize int = try_cast(dbo.as_setting('sitemappagesize', '10') as int)
    
	declare @s nvarchar(max)
	set @s = '';
	set @s = Replace(@s + (select 'https://'+@domain+ loc loc, convert(nvarchar(10), lastmod, 120) lastmod, changefreq, priority
                           from (select * from as_sitemap 
                                 order by id                                				
								OFFSET @PageSize * (@Page - 1) ROWS
								FETCH NEXT @PageSize ROWS ONLY
                                ) t1
                           
                           FOR XML RAW ('url'), 
                           ROOT ('urlset'), ELEMENTS), 
                     '', '')


	select top 1 1 Result, '' Msg, @s Text, 'text/xml' MimeType from as_settings where code='sitemap.xml'
END

Настройка sitemappagesize указывает сколько на 1 странице sitemap может быть записей (ВАЖНО - в robots будет также указаны все ссылки на страницы sitemap). 

Настройка robots.txt

У robots.txt есть статичная и динамическая часть. Статичная часть заполняется через настройку с кодом robots.txt.

Чтобы в robots.txt была добавка host и страниц сайтмапа, необходимо настройку robotsAddHostSitemap установить в 1.

В /rsfiletypes для кода robots реализуем процедуру вывода robots: 

CREATE PROCEDURE [dbo].[rs_robots_getFile]
	@urlParameters DictionaryParameter READONLY,
	@username nvarchar(32),
	@langID int = 0
AS
BEGIN
	declare @domain nvarchar(128) = (select Value  from @urlParameters where [Key] = 'as_domain')
    
    
    declare @s nvarchar(max) = isnull((select top 1 Value from as_settings where code='robots.txt'), '')
    declare @robotsAddHostSitemap bit = iif(dbo.as_setting('robotsAddHostSitemap', '0')='1', 1, 0)
    
      if(@robotsAddHostSitemap=1) begin
    	set @s = @s  + char(10) + 'Host: https://' + @domain + char(10)

        declare @total int = isnull((select count(*) from as_sitemap), 0)
        declare @sitemapPageSize int = isnull(try_cast(dbo.as_setting('sitemappagesize', '10') as int), 0)
        if(@total>0 and @sitemapPageSize>0) begin 
            declare @i int = 0, @pages float = @total / cast(@sitemapPageSize as float)

            while (@i<=@pages) begin
                set @s = @s  + char(10) + 'Sitemap: https://' + @domain +'/sitemap.xml' + iif(@i+1>1, '?page='+ cast((@i+1) as nvarchar), '')

                set @i = @i  + 1
            end
        end
    end

	select 1 Result, '' Msg, @s Text, 'text/plain' MimeType 
END

Берем статичную часть и добавляем к ней директиву Host и список всех страниц sitemap. 

После всех настроек проверяем как работают адреса /stemap.xml и /robots.txt (в URL rewrite должны быть правила для подмены адреса  - https://pastebin.com/T9r2rafK).

Страница-источник на сайте falconspace.ru