Необходимость ручного изготовления планов сайта (в противовес автоматическому обходу поисковиком) вызвана тем обстоятельством, что 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 странички:
Рассмотрим второй способ формирования плана сайта подробнее. Например для сайта 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: .............
Планы сайтов с криптографически-зашифрованными URL, как на http://www.votpusk.ru/ или на http://www.youtube.com/ - формируются ровно так же. Только обходить надо не стандартную табличку для хранения ASP.NET-пользователей aspnet_Users, а вашу собственную табличку. И, конечно, обрабатывать URL вашим криптографическим движком.
| <На главную> <В раздел ASP> <В раздел NET> <В раздел SQL> <В раздел Разное> <Написать автору> < Поблагодарить> |