Guida alle Sitemaps: Creare una sitemaps in ASP

a cura di Guido Arata

Oggi vediamo come generare una sitemap  usando ASP.

Ecco il codice ASP per generare una sitemap per un webserver. La pagina si chiama sitemap_gen.asp :

<%
' sitemap_gen.asp
' A simple script to automatically produce  for a webserver, in the  Sitemap Protocol (GSP)
' by Francesco Passantino
' www.iteam5.net/francesco/sitemap_gen
' v0.1  04.06.05
' v0.2  05.06.05 Listing a directory tree recursively improvement
' v0.3b 09.06.05 File exclusion by Calvin Dunkley
' v0.4  17.06.05 iso8601dates http://www.tumanov.com/projects/scriptlets/iso8601dates.asp
' v0.4b 18.06.05 vdrir bug fixed
' v0.4c 13.07.05 phisical dir patch for some windows systems
'
' BSD 2.0 license,
' http://www.opensource.org/licenses/bsd-license.php

'modificare in base al proprio dominio
session('server')='http://www.yourdomain.net'
vDir = '/'
phisicalDir='C:Inetpubwwwroot'

'Info qui http://www.time.gov/
utcOffset=1

set objfso = CreateObject('Scripting.FileSystemObject')
root = Server.MapPath(vDir)

response.ContentType = 'text/xml'
response.write '<?xml version='1.0' encoding='UTF-8'?>'
response.write '<!-- generator='http://www.iteam5.net/francesco/sitemap_gen'-->'
response.write '<urlset xmlns='http://www..com/schemas/sitemap/0.84'>'

Set objFolder = objFSO.GetFolder(root)
'response.write getfilelink(objFolder.Path,objFolder.dateLastModified)
Set colFiles = objFolder.Files
For Each objFile In colFiles
        response.write getfilelink(objFile.Path,objfile.dateLastModified)
Next
ShowSubFolders(objFolder)

response.write '</urlset>'
set fso = nothing

Sub ShowSubFolders(objFolder)
        Set colFolders = objFolder.SubFolders
        For Each objSubFolder In colFolders
                if folderpermission(objSubFolder.Path) then
                        response.write getfilelink(objSubFolder.Path,objSubFolder.dateLastModified)
                        Set colFiles = objSubFolder.Files
                        For Each objFile In colFiles
                                response.write getfilelink(objFile.Path,objFile.dateLastModified)
                        Next
                        ShowSubFolders(objSubFolder)
                end if
        Next
End Sub

Function getfilelink(file,data)
        file=replace(file,phisicalDir,'')
        file=replace(file,'','/')
        If FileExtensionIsBad(file) then Exit Function
        If FileNameIsBad(file) then Exit Function
        filelmdate=iso8601date(data,utcOffset)

        getfilelink = '<url><loc>'&server.htmlencode(session('server')&file)&'</loc><lastmod>'&filelmdate&'</lastmod><priority>1.0</priority></url>'
        session('URLS')=session('URLS')+1
        Response.Flush
End Function

Function Folderpermission(pathName)
        'modificare qui per escludere un percorso
        PathExclusion=Array('   emp','_vti_cnf','_vti_pvt','_vti_log','cgi-bin')
        Folderpermission =True
        for each PathExcluded in PathExclusion
                if instr(ucase(pathName),ucase(PathExcluded))>0 then
                        Folderpermission = False
                        exit for
                end if
        next
End Function

Function FileExtensionIsBad(sFileName)
        Dim sFileExtension, bFileExtensionIsValid, sFileExt
        'http://www.googleguide.com/file_type.html
        Extensions = Array('png','gif','jpg','zip','pdf','ps','html','htm','asp','wk1','wk2','wk3','wk4','wk5','wki','wks','wku','lwp','mw','xls','ppt','doc','wks','wps','wdb','wri','rtf','ans','txt')

        if len(trim(sFileName)) = 0 then
                FileExtensionIsBad = true
                Exit Function
        end if

        sFileExtension = right(sFileName, len(sFileName) - instrrev(sFileName, '.'))
        bFileExtensionIsValid = false   'assume extension is bad
        for each sFileExt in extensions
                if ucase(sFileExt) = ucase(sFileExtension) then
                        bFileExtensionIsValid = True
                        exit for
                end if
        next
        FileExtensionIsBad = not bFileExtensionIsValid
End Function

Function FileNameIsBad(sFileName)
        if len(trim(sFileName)) = 0 then
                FileNameIsBad = true
                Exit Function
        end if
        Filename = Array('/alive.asp','/404.asp','/500.asp','/sitemap_gen.asp')
        FileNameNumber = ubound(Filename)
        for i=0 to FileNameNumber
                if Filename(i) = sFileName then
                        FileNameIsBad = True
                end if
        next
End Function

Function iso8601date(dLocal,utcOffset)
        Dim d
        ' Converte l' ora locale in UTC
        d = DateAdd('H',-1 * utcOffset,dLocal)

        ' crea la data
        iso8601date = Year(d) & '-' & Right('0' & Month(d),2) & '-' & Right('0' & Day(d),2) & 'T' & _
                Right('0' & Hour(d),2) & ':' & Right('0' & Minute(d),2) & ':' & Right('0' & Second(d),2) & 'Z'
End Function
%>

Di seguito, invece, il codice di sitemap_gen_db.asp , per generare una sitemap dinamica, auto-aggiornabile da database:

' by Francesco Passantino
' www.iteam5.net/francesco/sitemap_gen
' v0.1b released 5 june 2005
' v0.2  released 17 june 2005 iso8601dates http://www.tumanov.com/projects/scriptlets/iso8601dates.asp
' v0.2b released 28 july 2005 id_page=Server.URLEncode(rs('id')) to put words in id, thanks to Mike Kellogg
'
' BSD 2.0 license,
' http://www.opensource.org/licenses/bsd-license.php

MAXURLS_PER_SITEMAP = 50000

'modificare in base al proprio URL
baseurl='http://www.yoursite.com/default.asp?page='

xDb_Conn_Str = 'Provider=.Jet.OLEDB.4.0;Data Source=' & server.mappath('dbyourdb.mdb') & ';'
strsql = 'SELECT * FROM yourtable'

'info su http://www.time.gov/
utcOffset=1

response.ContentType = 'text/xml'
response.write ''
response.write ''
response.write ''

Set conn = Server.CreateObject('ADODB.Connection')
conn.Open xDb_Conn_Str
Set rs = Server.CreateObject('ADODB.Recordset')
rs.Open strsql, conn
Do while not rs.eof
        if URLS1.0 then priority='1.0'

                response.write ''&server.htmlencode(baseurl&id_page)&''&filedate&''&priority&''
                URLS=URLS+1
                Response.Flush
        rs.movenext
end if
Loop

response.write ''

rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing

Infine, lo script sitemap_gen_spider, per creare sitemap usando l’ MSXML spider:

<%
' sitemap_gen_spider.asp
' A simple script to automatically produce  for a webserver, in the  Sitemap Protocol (GSP)
' by Francesco Passantino
' www.iteam5.net/francesco/sitemap_gen
' v0.1 released 9 june 2005
' v0.2 released 17 june 2005 iso8601dates http://www.tumanov.com/projects/scriptlets/iso8601dates.asp
'
' BSD 2.0 license,
' http://www.opensource.org/licenses/bsd-license.php

'configurazione dello script
Url='http://www.yoursite.com/'
FinalDepth=3
LimitUrl=100
'lasciare sitemapDate vuoto se si vuole che appaia sitemapDate=now
sitemapDate=''
'da 0.1 a 1.0
sitemapPriority='0.7'
'valori possibili: always, hourly, daily, weekly, monthly, yearly, never
sitemapChangefreq='monthly'
'info su http://www.time.gov/
utcOffset=1

Dim objRegExp,objUrlArchive,strHTML,objMatch
Server.ScriptTimeout=300
set xmlhttp = CreateObject('MSXML2.ServerXMLHTTP')
Set objUrlArchive=Server.CreateObject('Scripting.Dictionary')
Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = True

'modificabili a piacimento
objRegExp.Pattern = 'href=(.*?)[s|>]'
'per rimuovere elementi dagli url html
RemoveText=array('<','>','a href=',chr(34),''','href=')
'per escludere elementi dagli URL
ExcludeUrl=array('mailto:','javascript:','.css','.ico')

'si si vuole che risulti sitemapDate=now
if sitemapDate='' then filelmdate=now()

sitemapDate=iso8601date(filelmdate,utcOffset)

crawl url,0

For Depth=0 to FinalDepth
        arrUrl=objUrlArchive.Keys
        arrDepth=objUrlArchive.Items
        For LoopUrl= 0 to ubound(arrurl)-1

                'debugging
                'response.write '<!-- pagefound=''&loopurl&''-->'

                crawl url&'/'&arrUrl(LoopUrl),Depth

                'se si vuole limitare il numero amssimo di URL
                'if objUrlArchive.Count-1>LimitUrl then exit for

        Next
        erase arrUrl
        erase arrDepth
Next

' crea l' XML
arrUrl=objUrlArchive.Keys
arrDepth=objUrlArchive.Items
response.ContentType = 'text/xml'
response.write '<?xml version='1.0' encoding='UTF-8'?>'
response.write '<!-- generator='http://www.iteam5.net/francesco/sitemap_gen'-->'
response.write '<!-- pagefound=''&ubound(arrurl)&''-->'
response.write '<urlset xmlns='http://www..com/schemas/sitemap/0.84'>'
For LoopUrl=0 to ubound(arrurl)-1
        response.write '<url>'
        response.write '<loc>'&server.htmlencode(url&arrUrl(LoopUrl))&'</loc>'
        response.write '<lastmod>'&sitemapDate&'</lastmod>'
        response.write '<priority>'&sitemapPriority&'</priority>'
        response.write '<changefreq>'&sitemapChangefreq&'</changefreq>'
        response.write '</url>'
Next
response.write '</urlset>'

erase arrUrl
erase arrDepth
objUrlArchive.RemoveAll()
set xmlhttp = nothing

Sub crawl(url,depth)
        xmlhttp.open 'GET', url, false
        xmlhttp.send ''
        strHTML = xmlhttp.responseText

        For Each objMatch in objRegExp.Execute(strHTML)
                for i=0 to ubound(excludeUrl)
                        if instr(objmatch,excludeUrl(i))>0 then objmatch=''
                next
                if objmatch<>'' then
                        for i=0 to ubound(RemoveText)
                                objMatch=replace(lcase(objMatch),lcase(RemoveText(i)),'')
                        next
                        'in alcune occasioni è meglio sostituire con if left(objMatch,len(url))=Url then
                        if instr(objMatch,'http://')=0 and objmatch<>'' then
                                if objUrlArchive.Exists(objMatch)=false then
                                        objUrlArchive.Add objMatch,depth

                                        'debugging
                                        'response.write objmatch&'<br>'
                                        'response.flush

                                end if
                        end if
                end if
        Next
End Sub

Function iso8601date(dLocal,utcOffset)
        Dim d
        ' converte l' ora locale in UTC
        d = DateAdd('H',-1 * utcOffset,dLocal)

        ' compone da data
        iso8601date = Year(d) & '-' & Right('0' & Month(d),2) & '-' & Right('0' & Day(d),2) & 'T' & _
                Right('0' & Hour(d),2) & ':' & Right('0' & Minute(d),2) & ':' & Right('0' & Second(d),2) & 'Z'
End Function
%>

WebMasterPoint.org - Creative Commons Attribution-Noncommercial-Share Alike 2.0 Generic

Articoli Correlati