Io, su un progetto aziendale, ho usato questo sistema:
Nel db, nella tabelle relativa agli argomenti da visualizzare, ho aggiunto un campo di nome URLPagina dove memorizzo la url fittizia per quel determinato argomento.
Nella root del sito ho messo una pagina "execute.asp" e su IIS l'ho configurata come pagina di errore 404 mettendo come url il valore /execute.asp
Esempio:
Chiamo la pagina www.miosito.it/corso-asp-vbScript.html
Questa pagina sul file system non esiste ovviamente.
Una volta chiamata succede che IIS non la trova e quindi genera un errore 404 Not Found e passa la risposta alla pagina execute.asp
execute.asp recupera dalla queryString la url della pagina cercata:
codice:
<%
url = request.serverVariables("QUERY_STRING")

serverName = request.serverVariables("SERVER_NAME")

'verifico che ci sua davvero una url da trattare
  if len(url) > 0 then
  ' tolgo i dati di troppo dalla url non trovata perchè il valore di url
  ' nel nostro esempio sarebbe uguale a 
  ' 404;http://www.miosito.it:80/corso-asp-vbScript.html
  url = lCase(url)
  url = replace(url,"404;","")
  url = replace(url,":80","")
  url = replace(url,"http://" & serverName & "/","")
  ' adesso url sarà uguale a corso-asp-vbScript.html
else
  response.write "La pagina non esiste"
  response.end
end if

' mi connetto al db
set conn = ...
conn.open ...

' faccio una query per ottenere i dati relativi al recordo dove url = 'corso-asp-vbScript.html'
sql = "SELECT * FROM argomenti WHERE [url] = '" & url & "'"
set rs = conn.execute(sql)

  if not rs.eof then
    response.write rs("titolo") & "
"
    response.write rs("testo")
  else
    response.write "Dati non trovati"
  end if

rs.close
set rs = nothing

conn.close
set conn = nothing
%>
In questo modo sulla barra degli indirizzi resta la url
http://www.miosito.it/corso-asp-vbScript.html
ma in realtà è la pagina execute.asp che fa il lavoro.