Делаем SEO SiteMap.
Необходимость ручного изготовления планов сайта (в противовес автоматическому обходу поисковиком) вызвана тем обстоятельством, что GOOGLE (и другие поисковики) обходят лишь 1000 страниц сайта. Между тем на сайте http://www.votpusk.ru/ за несколько месяцев работы зарегистрировалось шесть тысяч юзеров, некоторые из них (как вы можете увидеть на http://foto.votpusk.ru/ разместили более 500 фотографий (с комментариями и описанием), по каждой из сотен стран и отелей юзера разместили сотни рассказов, например более ста рассказов о путешествиях по Египту - всего более полумиллиона единиц контента. А автоматически ГУГЛ учитывает лишь 1000 тысячу страниц - 0,2% содержимого сайта!
На сайте http://www.interbooking.ru/ тоже содержится около 50 тысяч описаний отелей. Каждый из них описан тоже на нескольких страничках: фото, описание, отзывы и так далее. Та же самая ситауция - ГУГЛ индексирует мизернейшую часть общего контента сайта.
В некоторых отдельных случаях можно попробовать применить автоматический генератор Sitemap, например http://www.xml-sitemaps.com/ - однако для такого генератора требуется весьма специфическая структура сайта. Каждая страничка должна быть достижима из корня сайта, причем достижима по ссылкам, а не по нажатию кнопок или меню на активных сайтах. А второе органичение автоматических генераторов - если некой контент достижим по другому URL сайта (часто бестолковому, точно не характеризующему страну-отель например), то автогенератор произведет слияние URL и в итоговом плане сайта на нужную страничку будет ссылаться бестолковый URL. Кроме того, по реальным сайтам (от полмиллиона страниц и выше) ничего хорошего автогенератор не построит.
Поэтому, на практике, мне во всех моих сайтах пришлось выпускать вот такие планы сайтов для SEO:
1: <urlset>
2: <url>
3: <loc>http://story.votpusk.ru/story1.aspx?i=e17e5ad9-0207-42b3-bc65-9802f132d0ef&j=3E355292208B92CA072A7CDC030AEADEA13C&Country=EG&Kurort=EG01&Otel=EG010</loc>
4: <lastmod>2010-06-12</lastmod>
5: <changefreq>monthly</changefreq>
6: <priority>0.6</priority>
7: </url>
8: <url>
9: <loc>http://story.votpusk.ru/story1.aspx?i=7029a806-aca3-4175-aaf9-a53232a0d3ad&j=22F90E7B9601BD090C097AF3EB38572BA13C&Country=EG&Kurort=EG01&Otel=нет</loc>
10: <lastmod>2010-06-12</lastmod>
11: <changefreq>monthly</changefreq>
12: <priority>0.6</priority>
13: </url>
14: ....
15: </urlset>
1: <urlset>
2: <url>
3: <loc>http://www.interbooking.ru/ru/cities-AL.aspx</loc>
4: <lastmod>2010-02-28</lastmod>
5: <changefreq>weekly</changefreq>
6: <priority>0.6</priority>
7: </url>
8: <url>
9: <loc>http://www.interbooking.ru/ru/cities-AM.aspx</loc>
10: <lastmod>2010-02-28</lastmod>
11: <changefreq>weekly</changefreq>
12: <priority>0.6</priority>
13: </url>
14: ....
15: </urlset>
Метод выпуска плана сайта зависит от способа формирования URL странички:
- Статические странички, лежащие в каталоге сайта. Для выпуска плана по такому сайту надо обойти каталог сайта рекурсивным двжком. Этот рекурсивный движок описан у меня на страничке Опыт видео-конвертации - только там он обходит FLV (и другие) медиафайлы, а надо обходить html (или aspx) Файлы.
- Странички, URL которых формируется одним из URL-реврайтеров. Выпуск плана такого сайта можно сделать непосредственно на уровне SQL.
- Странички, URL которых криптографически защищен (как у меня на http://www.votpusk.ru/ или на http://www.youtube.com/ - на уровне SQL URL такого сайта не виден, план такого сайта выпускается кодом. Исключение - если криптографический URL сформирован встроенными средствами СУБД, например для PostgreSQL URL_KEY=pgp_sym_encrypt(record_number, password) - плано такого сайта тоже можно выпустить с помощью SQL-процедуры.
Рассмотрим второй способ формирования плана сайта подробнее. Например для сайта Interbooking есть некая табличка (travco_hotels) кодержащая код отеля - на основании которой реврайтером формируется URL. Для такой схемы указанный выше план сайта может быть выпущен двумя вот такими простенькими процедурами - внешней и внутренней. Функция внешней процедуры - создание среды для работы внутренней процедуры и дробление плана по тысяче URL:
вы можете полностью применить эти процедуры для составления своих планов. Для этого замените в ней только курсор на свою табличку.
1: ALTER procedure [dbo].[CreateSiteMap2]
2: AS
3: --табла в которой будет итоговый SiteMap
4: Create TABLE [dbo].[#SITEMAP](
5: [i] [int] IDENTITY(1,1) NOT NULL,
6: [TXT] [nvarchar](500) NULL
7: ) ON [PRIMARY]
8: SET NOCOUNT ON
9: --табла для отсчета по 1000
10: Create TABLE [dbo].[#travco_hotel_code](
11: [i] [int] IDENTITY(1,1) NOT NULL,
12: [code] [nvarchar](3) NULL
13: ) ON [PRIMARY]
14:
15: insert #travco_hotel_code
16: SELECT [hotel_code]
17: FROM [interbooking-4].[dbo].[travco_hotels]
18: group by [hotel_code]
19:
20:
21: Declare @HotelCount int, @StepCount int, @CurrentIndex int, @CurrentStep int, @InternalIndex int, @StopIndex int
22: Select @StepCount=300, @CurrentIndex=1, @CurrentStep=1, @InternalIndex =1
23: select @HotelCount=count(*) from #travco_hotel_code
24: while @CurrentIndex<=@HotelCount BEGIN
25: print @CurrentStep
26: print @CurrentIndex
27: print ''
28: select @InternalIndex=@CurrentIndex
29: if (@CurrentIndex+@StepCount<@HotelCount) Select @StopIndex=@CurrentIndex+@StepCount
30: else select @StopIndex=@HotelCount
31: Exec CreateSiteMapInternal1 @StartIndex=@InternalIndex, @StopIndex=@StopIndex
32: --While @InternalIndex<@CurrentIndex+@StepCount BEGIN
33: -- print @InternalIndex
34: -- Exec CreateSiteMapInternal @InternalIndex=@InternalIndex
35: -- Select @InternalIndex=@InternalIndex+1
36: -- if (@InternalIndex>@HotelCount) GOTO EXIT1
37: --END
38: INSERT #SITEMAP SELECT ''
39: INSERT #SITEMAP SELECT ''
40: INSERT #SITEMAP SELECT ''
41: print '*'
42: select @CurrentStep=@CurrentStep+1, @CurrentIndex=@CurrentIndex+@StepCount
43: END
44: EXIT1:
45: --select * from #travco_hotel_code
46:
47: drop table #travco_hotel_code
48: SELECT TXT FROM [#SITEMAP] ORDER BY I
49: DROP TABLE #SITEMAP
А функция внутренней процедуры - непосредственно вычитывание кода отеля и формирование внешнего URL по коду, хранимому в базе - так же как этот URL формирует URL-реврайтер. Кроме того, у сайта имеется десяток статических страничек - я добавил их к автоматически генерируемым реврайтером страничками.
1: ALTER Procedure [dbo].[CreateSiteMapInternal1]
2: @StartIndex int,
3: @StopIndex int
4: as
5: INSERT #SITEMAP SELECT '<?xml version="1.0" encoding="utf-8" ?>'
6: INSERT #SITEMAP SELECT '<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >'
7: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/countries.aspx" title="Бронирование отелей." description="Бронирование отелей.">'
8: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/FAQ.aspx" title="Бронирование отелей. Вопросы и ответы." description="Бронирование отелей. Вопросы и ответы." />'
9: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Platite.aspx" title="Бронирование отелей. Оплата." description="Бронирование отелей. Оплата." />'
10: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/HowBooking.aspx" title="Бронирование отелей. Как забронировать." description="Бронирование отелей. Как забронировать." />'
11: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/About.aspx" title="Бронирование отелей. О нас." description="Бронирование отелей. Как забронировать." />'
12: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Rules.aspx" title="Бронирование отелей. Правила и условия бронирования." description="Бронирование отелей. Правила и условия бронирования." />'
13: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/Security.aspx" title="Бронирование отелей. Безопасность бронирования." description="Бронирование отелей. Безопасность бронирования." />'
14: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/visa.aspx" title="Бронирование отелей. Визы." description="Бронирование отелей. Визы." />'
15: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/countries.aspx" title="Бронирование отелей. Страны." description="Бронирование отелей. Страны." >'
16: DECLARE @Con_ID nvarchar(4), @Con_travco_code nvarchar(4), @Con_Name nvarchar(50), @country_en nvarchar(50), @Country_FETCH_STATUS int, @country_ru_rod nvarchar(50), @country_ru_pred nvarchar(50)
17: DECLARE CountryCursor CURSOR FOR
18: SELECT id_countries, travco_code, country_ru, country_en , country_ru_rod from dbo.countries
19: WHERE not (travco_code is null)
20: and EXISTS (SELECT country_code from dbo.travco_hotels where travco_hotels.country_code=countries.travco_code group by country_code)
21: OPEN CountryCursor
22: FETCH NEXT FROM CountryCursor INTO @Con_ID, @Con_travco_code, @Con_Name ,@country_en, @country_ru_rod
23: SELECT @Country_FETCH_STATUS=@@FETCH_STATUS
24: WHILE @Country_FETCH_STATUS = 0 BEGIN
25: PRINT 'ConID='+@Con_ID + ', Con_travco_code='+ @Con_travco_code + ', Con_Name ='+ @Con_Name
26: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/cities-'+ISNULL(@Con_ID,'')+'.aspx" title="Отели '+ISNULL(@country_ru_rod,'') +', онлайн бронирование отелей в '+ISNULL(@country_ru_rod,'')+', гостиницы '+ISNULL(@country_ru_rod,'')+', '+@country_en+' hotels- система бронирования отелей InterBooking.ru" description=" Бронирование отелей в '+ISNULL(@country_ru_rod,'')+', гостиницы '+ISNULL(@country_ru_rod,'')+', '+@country_en+' hotels reservation - онлайн бронирование отелей по всему миру с InterBooking.ru" >'
27: DECLARE @City_ID nvarchar(3), @City_countries_ID nvarchar(4), @CityName varchar(50), @City_FETCH_STATUS int, @City_travco_code nvarchar(4), @city_en Varchar(30), @city_ru_rod nVarchar(50), @city_ru_pred nVarchar(50)
28: DECLARE CityCursor CURSOR FOR
29: SELECT id_cities, id_countries ,city_ru, travco_code, city_en, city_ru_rod, city_ru_pred from dbo.cities
30: WHERE dbo.cities.id_countries= @Con_ID
31: and EXISTS (SELECT city_code from dbo.travco_hotels
32: join #travco_hotel_code on #travco_hotel_code.code=travco_hotels.hotel_code
33: where travco_hotels.city_code=cities.id_cities and
34: #travco_hotel_code.i>@StartIndex and #travco_hotel_code.i<@StopIndex
35: group by city_code)
36: OPEN CityCursor
37: FETCH NEXT FROM CityCursor INTO @City_ID, @City_countries_ID, @CityName , @City_travco_code, @city_en, @city_ru_rod, @country_ru_pred
38: SELECT @City_FETCH_STATUS=@@FETCH_STATUS
39: WHILE @City_FETCH_STATUS = 0 BEGIN
40: PRINT 'CityID='+@City_ID + ', CityName='+ @CityName
41: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/city-'+ISNULL(@City_ID,'')+'.aspx" title="Отели '+ISNULL(@city_ru_rod,'')+', онлайн бронирование отелей в '+ISNULL(@city_ru_pred,'')+', цены на гостиницы '+ISNULL(@city_ru_rod,'')+', '+ISNULL(@city_en,'')+' hotels - система бронирования отелей InterBooking.ru" description="Отели '+ISNULL(@city_ru_rod,'')+', фото, отзывы гостиниц '+ISNULL(@city_ru_rod,'')+', система онлайн бронирования отелей '+ISNULL(@city_ru_rod,'')+', '+ISNULL(@city_en,'')+' hotels- InterBooking.ru" >'
42: INSERT #SITEMAP SELECT ''
43: DECLARE @HotID nvarchar(4), @HotName nvarchar(50), @Hot_FETCH_STATUS int
44: DECLARE HotCursor CURSOR FOR
45: SELECT hotel_code, hotel_name from dbo.travco_hotels
46: join #travco_hotel_code on #travco_hotel_code.code=dbo.travco_hotels.hotel_code
47: WHERE city_code= @City_travco_code and country_code=@Con_travco_code
48: and #travco_hotel_code.i>@StartIndex
49: and #travco_hotel_code.i<=@StopIndex
50: OPEN HotCursor
51: FETCH NEXT FROM HotCursor INTO @HotID, @HotName
52: SELECT @Hot_FETCH_STATUS=@@FETCH_STATUS
53: WHILE @Hot_FETCH_STATUS = 0 BEGIN
54: PRINT 'HotID='+@HotID+', HotName=' +@HotName
55: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-info-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
56: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-comments-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
57: INSERT #SITEMAP SELECT '<siteMapNode url="http://www.interbooking.ru/ru/hotel-prices-0-'+ISNULL(@HotID,'')+'.aspx" title="Отель '+replace(ISNULL(@HotName,''),'&','&')+' - '+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отзывы, фото, посмотреть на карте отель '+replace(ISNULL(@HotName,''),'&','&')+' - Система бронирования отелей InterBooking.ru" description="'+ISNULL(@CityName,'')+', '+ISNULL(@Con_Name,'')+' - отель '+replace(ISNULL(@HotName,''),'&','&')+', фото, отзывы, '+ISNULL(@country_en,'')+' hotels - онлайн бронирование отелей по всему миру с InterBooking.ru" />'
58: INSERT #SITEMAP SELECT ''
59: FETCH NEXT FROM HotCursor INTO @HotID, @HotName
60: SELECT @Hot_FETCH_STATUS=@@FETCH_STATUS
61: END
62: CLOSE HotCursor
63: DEALLOCATE HotCursor
64: INSERT #SITEMAP SELECT '</siteMapNode>'
65: FETCH NEXT FROM CityCursor INTO @City_ID, @City_countries_ID, @CityName , @City_travco_code, @city_en, @city_ru_rod, @country_ru_pred
66: SELECT @City_FETCH_STATUS=@@FETCH_STATUS
67: END
68: CLOSE CityCursor
69: DEALLOCATE CityCursor
70: INSERT #SITEMAP SELECT '</siteMapNode>'
71: FETCH NEXT FROM CountryCursor INTO @Con_ID, @Con_travco_code, @Con_Name ,@country_en, @country_ru_rod
72: SELECT @Country_FETCH_STATUS=@@FETCH_STATUS
73: END
74: CLOSE CountryCursor
75: DEALLOCATE CountryCursor
76: INSERT #SITEMAP SELECT '</siteMapNode>'
77: INSERT #SITEMAP SELECT '</siteMapNode>'
78: INSERT #SITEMAP SELECT '</siteMap>'
Теперь рассмотрим третий способ формирования SEO SiteMap - кодом выше уровня СУБД. Я приведу пример SiteMap для ASP.NET-сайта, построенного на стандартных ASP.NET пользователях. Этот код вы можете использовать в своих проектах без изменения - лишь изменив текстовый литерал со своим доменом и названием странички.
Планы сайтов на стандартных ASP-NET пользователях, запоминаемых в aspnet_Users я делаю вот так: есть страничка, на которой размещается перечень пользователей (разбитый по тысяче пользователей) - при клике по линку всплывает форма с планов home-page указанной тысячи пользователей:
1: <%@ Page Language="VB" MasterPageFile="~/CMN/M2.master" AutoEventWireup="false" CodeFile="admin_SEO_users.aspx.vb"
2: Inherits="admin_SEO_users" %>
3:
4: <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
5: <asp:DataList ID="DataList1" runat="server" DataKeyField="StartNum" DataMember="DefaultView">
6: <ItemTemplate>
7: <a onclick="window.open('','SEO','resizable=yes,menubar=no,scrollbars=yes,width=600,height=700');"
8: name='<%# Eval("StartNum") %> : <%#Eval("EndNum")%>' target='SEO' title='<%# Eval("StartNum") %> : <%#Eval("EndNum")%>'
9: href="SeoUsers.ashx?StartNum=<%# Eval("StartNum") %>&EndNum=<%# Eval("EndNum") %>">
10: <%# Eval("StartNum") %>
11: :
12: <%#Eval("EndNum")%>
13: </a>
14: </ItemTemplate>
15: </asp:DataList>
16: <asp:SqlDataSource ID="GetStoryPageCount" runat="server" ConnectionString="<%$ ConnectionStrings:SQLServer_ConnectionStrings %>"
17: SelectCommandType="Text" SelectCommand="select COUNT(*) as User_count from dbo.vw_aspnet_MembershipUsers">
18: </asp:SqlDataSource>
19: </asp:Content>
1: Partial Class admin_SEO_users
2: Inherits System.Web.UI.Page
3:
4: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
5: If Not IsPostBack Then
6: Dim DV1 As Data.DataView = GetStoryPageCount.Select(New DataSourceSelectArguments)
7: If DV1 IsNot Nothing Then
8: If DV1.Count > 0 Then
9: Dim RowCount As Integer = DV1(0)("User_count")
10: Dim EndPageNum As Integer = RowCount \ 1000 + 1
11: Dim Dv2 As New Data.DataTable("Pager")
12: Dv2.Columns.Add("StartNum", System.Type.GetType("System.Int32"))
13: Dv2.Columns.Add("EndNum", System.Type.GetType("System.Int32"))
14: For i = 0 To EndPageNum - 2
15: Dv2.Rows.Add(i * 1000, (i + 1) * 1000)
16: Next
17: Dv2.Rows.Add((EndPageNum - 1) * 1000, RowCount - 1)
18: DataList1.DataSource = Dv2
19: DataList1.DataBind()
20: End If
21: End If
22: End If
23: End Sub
24:
25: End Class
Как видите, все что делает эта страничка - это формирует строки таблицы по тысячу юзеров и формирует вызов хандлера. Никакой защиты для вызова хандлера не требуется - план сайта это несекретная информация. В хандрере формируется собственно XML плана сайта:
1: <%@ WebHandler Language="VB" Class="SeoUsers" %>
2:
3: Imports System
4: Imports System.Web
5:
6: Public Class SeoUsers : Implements IHttpHandler
7:
8: Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
9: Try
10: Dim CryptoStoryNumber As String
11: Dim DV1 As Data.DataView
12: Dim CN1 As New Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
13: CN1.Open()
14: Dim CMD1 As New Data.SqlClient.SqlCommand("GetUsersCount", CN1)
15: CMD1.CommandType = Data.CommandType.StoredProcedure
16: CMD1.Parameters.Add("StartNum", Data.SqlDbType.Int)
17: CMD1.Parameters.Add("EndNum", Data.SqlDbType.Int)
18: CMD1.Parameters("StartNum").Value = context.Request.QueryString("StartNum").Trim
19: CMD1.Parameters("EndNum").Value = context.Request.QueryString("EndNum").Trim
20: context.Response.ContentType = "text/plain"
21: context.Response.Write("<urlset>" & vbCrLf)
22: Dim DR1 As Data.SqlClient.SqlDataReader = CMD1.ExecuteReader
23: While DR1.Read
24: context.Response.Write(" <url>" & vbCrLf)
25: context.Response.Write(" <loc>")
26: context.Response.Write("http://user.votpusk.ru/user_foto_all.aspx?i=" & DR1("UserID").ToString)
27: context.Response.Write("</loc>" & vbCrLf)
28: context.Response.Write(" <lastmod>" & Now.Year & "-" & Now.Month.ToString("00") & "-" & Now.Day.ToString("00") & "</lastmod>" & vbCrLf)
29: context.Response.Write(" <changefreq>monthly</changefreq>" & vbCrLf)
30: context.Response.Write(" <priority>0.6</priority>" & vbCrLf)
31: context.Response.Write(" </url>" & vbCrLf)
32: End While
33: context.Response.Write("</urlset>" & vbCrLf)
34: Catch ex As Exception
35: context.Response.ContentType = "text/plain"
36: context.Response.Write(ex.Message)
37: End Try
38: End Sub
39:
40: Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
41: Get
42: Return False
43: End Get
44: End Property
45:
46: End Class
Для порядковго перечисления ASP.NET-юзеров в таблице без первичного последовательного ключа используется процедурка GetUsersCount:
1: ALTER procedure [dbo].[GetUsersCount]
2: @StartNum int =0,
3: @EndNum int=1000
4: as
5: with All_Users as
6: (
7: select ROW_NUMBER() over (order by CreateDate asc) as [ROW_NUMBER] , UserID from dbo.vw_aspnet_MembershipUsers
8: )
9: select * from All_Users where [ROW_NUMBER]>=@StartNum and [ROW_NUMBER]<@EndNum
Не забудьте, что для корректного использования встроенных в ASP.NET польователей (по которым и сформирован этот план) необходимо верно указать базу в строке коннекта LocalSqlServer и провайдера доступа к базе. Ключевой фрагмент web.config для доступа к стандартным пользователям ASP.NET для MS SQL вы можете видеть ниже:
1: ..........
2: <connectionStrings>
3: <remove name="LocalSqlServer"/>
4: <add name="LocalSqlServer" connectionString="server=VOTPUSK;Initial Catalog=vOtpusk_1;Max Pool Size=1000;User ID=XXXXXXXXXX;Password=YYYYYYYYYYYY" providerName="System.Data.SqlClient" />
5: <add name="SQLServer_ConnectionStrings" connectionString="server=VOTPUSK;Initial Catalog=vOtpusk_2;Max Pool Size=1000;User ID=XXXXXXXXXX;Password=YYYYYYYYYYYY" providerName="System.Data.SqlClient" />
6: </connectionStrings>
7: <system.web>
8: <sessionState mode="StateServer"/>
9: <authentication mode="Forms">
10: <forms defaultUrl="Login.aspx" slidingExpiration="true" enableCrossAppRedirects="true" domain="votpusk.ru"/>
11: </authentication>
12: <httpRuntime maxRequestLength="300000"/>
13: <roleManager enabled="true" defaultProvider="AspNetSqlProvider">
14: <providers>
15: <remove name="AspNetSqlRoleProvider"/>
16: <remove name="AspNetWindowsTokenRoleProvider"/>
17: <add applicationName="/Votpusk" name="AspNetSqlProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="LocalSqlServer"/>
18: </providers>
19: </roleManager>
20: <membership>
21: <providers>
22: <remove name="AspNetSqlMembershipProvider"/>
23: <add applicationName="/Votpusk" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider,System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="False" requiresUniqueEmail="True" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="6" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
24: </providers>
25: </membership>
26: <profile defaultProvider="SqlProvider">
27: <providers>
28: <clear/>
29: <add applicationName="/Votpusk" name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlServer"/>
30: </providers>
31: <properties>
32: <!-- Отложенная регистрация -->
33: <add name="LoginIsActivate" type="System.Boolean"/>
34: <add name="LoginActivateGUID" type="String"/>
35: <add name="LoginClearDate" type="System.DateTime"/>
36: <!-- Cвойства юзера c формы основной регистрации-->
37: <add name="usNik" type="String"/>
38: <add name="usShortName" type="String"/>
39: <add name="usSex" type="String"/>
40: <add name="usCountry" type="String"/>
41: <add name="usTown" type="String"/>
42: <add name="usBirth" type="System.DateTime"/>
43: <!-- Cвойства юзера c формы дополнительный регистрации-->
44: <add name="usAbout" type="String"/>
45: .............