Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ikki84

URL Rewrite - como trabalhar com link dinâmico?

Recommended Posts

Olá amigos,

 

Depois de pesquisar em vários foruns e tutoriais não encontrei uma resposta p minha dúvida.

Estou trabalhando com url amigaveis a pouco tempo, p ser mais especifico uso a hospedagem UOLhost e trabalho com a linguagem ou ambiente ASP clássico. Sei que existem mtas informações em outras linguagens como php e outros, mas existem mtas dúvidas em asp clássico.

 

A dúvida é o seguinte, utilizei o acesso remoto pelo IIS 7 manager p fazer as permissões e importar meu arquivo .htaccess com as devidas instruções (único modo que funcionou até agora, pois o arquivo web.config do uol não me ajudou). Até aí tudo bem, já que minhas url's estáticas reescreveram certinho e o conteúdo exibia corretamente. A dureza foi quando comecei com a url dinâmica num canal de notícias que estou criando. A url quebrava os id e os números e exibia o titulo certinho, porém não exibe o conteúdo da notícia escolhida e exibe o famoso erro 404.

 

ex.: meusite.com.br/noticia-ler/data/titulo

 

O que não entendi até agora é como fazer o url rewrite capturar informaçoes do banco de dados. Também já criei pastas como o nome de data e titulo no meu servidor e também não houve resultado. De qualquer forma estou inserindo os códigos e as páginas relacionadas:

 

rewrite.asp (este é o arquivo com as informações que irá reescrever a url. Usei um include nas páginas)

 

<%Function  URLamigavel(param)
URLamigavel = param
End Function%>

<%Function urlAmigavel(pag, ByVal cat, ByVal tit)
dim URL, arquivo, parametros, sField, sValue, valor
URL = "http://www.meusite.com.br/"
If InStr(pag, ".asp" ) > 0 Then
arquivo = Left( pag, ( InStr(pag, ".asp" ) -1)  )
If InStr(pag, "?" ) Then
parametros = Split( Right( pag , Len(pag) -  InStr(pag, "?" ) ) , "&")
For j = 0 To UBound( parametros )
sField = left ( parametros(j) , InStr( parametros(j) , "=") -1 )
sValue = Right( parametros(j) , Len(parametros(j)) -  InStr( parametros(j) , "=") )
if valor = "" Then valor = sValue Else valor = valor &","& sValue End If
Next
End if
End if
If tit <> "" then
tit = "/"& FormataTitulo( tit )
If cat <> "" then
cat = "/"& FormataTitulo( cat )
End if
Else
tit = "/"
End if
If valor <> "" Then    valor = "-" & valor&".html"    End If
urlAmigavel = URL & arquivo & cat & tit & valor
End Function
'---------------------------------------------------------------
Function ereg_replace(ByVal ereg_vetor, ByVal repl, ByVal valor)

ereg_vetorV = Split(ereg_vetor, "-")
If ubound(ereg_vetorV) > 0 Then
charName   = Split(ereg_vetorV(0),"|")
For i_ereg = 0 To UBound(charName)
valor = Replace(valor, charName(i_ereg), repl)
Next
If UBound(ereg_vetorV) >= 1 then
charID     = Split(ereg_vetorV(1),"|")
If Join(charID) <> "" then
For i_ereg = 0 To UBound(charID)
valor = Replace(valor, "" & charID(i_ereg) & ";", repl)
Next
End if
End if
End If
ereg_replace = valor
End Function

'---------------------------------------------------------------</pre>
Function FormataTitulo( ByVal s )
s = Trim(s)
s = LCase(s)
s = ereg_replace("á|à|â|ã|ä|ª-@|224|225|226|227|228|229","a",s)
s = ereg_replace("é|è|ê|ë-232|233|234|235","e",s)
s = ereg_replace("í|ì|î|ï-236|237|238|239","i",s)
s = ereg_replace("ó|ò|ô|õ|º|ö-242|243|244|245|246|186","o",s)
s = ereg_replace("ú|ù|û|ü-249|250|251|252","u",s)
s = ereg_replace("ç-231","c",s)
s = ereg_replace("ñ","n",s)
s = replace(s , "-", "")
s = replace(s , "&", "")
s = replace(s , " ", "-")
s = replace(s , ",", "")
s = replace(s , "?", "")
s = replace(s , ":", "")
s = replace(s , "/", "")
s = replace(s , ".", "")
s = replace(s , "'", "")
s = replace(s , "´", "")
s = replace(s , """, "")
s = replace(s , "$", "s")
s = replace(s , "!", "")
s = replace(s , "%", "")
FormataTitulo = s
End Function %>

 

--------------------------------------------------------------------------------------------------------------------------------------

 

.htaccess (inserido pelo gerenciador remoto IIS 7)

 

[iSAPI_Rewrite]
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] 
RewriteRule  ^/default/?([a-zA-Z0-9_-]+)?(.html)?$ /default.asp [i,L]
RewriteRule  ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?PagAtual=$2 [i,L]
RewriteRule  ^/noticia-ler/?([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)-([0-9]+),([0-9]+),([0-9]+)/?(.html)?$ /noticia-ler.asp?id=$3 [i,L]

 

--------------------------------------------------------------------------------------------------------------------------------------

 

noticia.asp (link puxando a função "URLamigavel" do include)

 

<a  href="<%=URLamigavel("noticia-ler.asp?id=", rs("data"), rs("titulo"))%>"><%=rs("data")%> - <%=rs("titulo")%></a>

 

--------------------------------------------------------------------------------------------------------------------------------------

 

noticia-ler.asp (pagina onde deve exibir a notícia escolhida)

 

<%
call conecta ()


rs.CursorLocation = 3
rs.CursorType = 0
rs.LockType = 1
sel = ("select* from noticia where id = "&request.querystring("id"))
rs.open sel,cn,3,3

%>
<html>
<body>

<font color="#FFFFFF"><%=rs("data")%><br />
     <strong><%=rs("titulo")%></strong><br />
	    <br />
	    <br />
		<br />
       <%=rs("noticia")%>
     <br />
     <br />
     <br />
     <br />
     <br />
     <br />
     <br />
	  <div align="right"><strong>Fonte:</strong> <%=rs("fonte")%></div>


</body>
</html>
<%
call desconecta ()
%>

 

*Obs - já tentei alterar o request.querystring por titulo ou data ou ambos ao mesmo tempo e não tive resultado também.

 

 

Grato pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para montar a URL normal você precisa de um identificador exclusivo do registro no caso o "ID", as outras informações (data e titulo) são necessárias apenas para montar a URL amigável, uma vez que a data ou o título poderiam se repetir na base de dados e confundir o sistema na hora da consulta, então esses podem ser indicados e tratados na URL mas não utilizados como referência de busca, como percebi que era a forma que queria.

 

Então ficaria assim a URL normal (considerando que já tratou caracteres especiais e espaços em branco para inserir o titulo na string):

noticia-ler.asp?id=99&data=20110707&titulo=carpegiani-e-demitido-do-sao-paulo

 

Reescrevendo (.htaccess):

RewriteRule ^/noticia-ler/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/?$ /noticia-ler.asp\?id=$1&data=$2&titulo=$3 [L]

 

Reescrevendo (web.config)

<rule name="NameRule" stopProcessing="true">
 <match url="^noticia-ler/([^/]+)/([^/]+)/([^/]+)/?$" />
   <conditions>
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
   </conditions>
 <action type="Rewrite" url="noticia-ler.asp?id={R:1}&data={R:2}&titulo={R:3}" />
</rule>

 

Resultado:

noticia-ler/99/20110707/carpegiani-e-demitido-do-sao-paulo

 

Pode alterar a ordem das variáveis, mesclar ou de uma forma que achar melhor.

Espero que compreenda e seja de ajuda.

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado amigos!!

 

Tive uma solução, na verdade parcial, mas de grande ajuda. O Public2004 me ajudou na relação dos codigos, porque eu estava focando o

 

problema no meu arquivo "noticia.asp", achando que era algum erro de sintaxe ou coisa igual no link que puxava a notícia.

 

Minha página de exibição de notícias (noticia-ler.asp) está exibindo certinho c/ a url reescrita "site.com.br/id/data/titulo", só resta a

 

paginação da página "noticia.asp". Além de inserir e substituir os códigos tive que alterar meu arquivo ".htaccess". Pois estavam com os

 

nomes de parametros diferentes.

 

Vou postar os códigos, pois deve haver muitas pessoas perdidas nessa mesma questão.

 

rewrite.asp (NOVO - substituindo e inserindo o ByVal data no parametro {"pag, ByVal id, ByVal data, ByVal titulo"}

 

<%Function urlAmigavel(pag, ByVal id, ByVal data, ByVal titulo)
dim URL, arquivo, parametros, sField, sValue, valor
URL = "http://www.meusite.com.br/"
If InStr(pag, ".asp" ) > 0 Then
arquivo = Left( pag, ( InStr(pag, ".asp" ) -1)  )
If InStr(pag, "?" ) Then
parametros = Split( Right( pag , Len(pag) -  InStr(pag, "?" ) ) , "&")
For j = 0 To UBound( parametros )
sField = left ( parametros(j) , InStr( parametros(j) , "=") -1 )
sValue = Right( parametros(j) , Len(parametros(j)) -  InStr( parametros(j) , "=") )
if valor = "" Then valor = sValue Else valor = valor &","& sValue End If
Next
End if
End if
If data <> "" then
data = "/"& FormataTitulo( data )
If titulo <> "" then
titulo = "/"& FormataTitulo( titulo )
If id <> "" then
id = "/"& FormataTitulo( id )
End if
End if
Else
titulo = "/"
End if
If valor <> "" Then    valor = "-" & valor&".html"    End If
urlAmigavel = URL & arquivo & id & data & titulo & valor
End Function

 

 

----------------------------------------------------------------------

 

.htaccess (NOVO)

 

[iSAPI_Rewrite]
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] 
RewriteRule  ^/default/?([a-zA-Z0-9_-]+)?(.html)?$ /default.asp [i,L]
RewriteRule  ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?pag=$2 [i,L]
RewriteRule ^/noticia-ler/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/?$ /noticia-ler.asp\?id=$1&data=$2&titulo=$3 [L]

 

----------------------------------------------------------------------

 

web.config (inserindo as regras)

 

<rule name="Reescrever url noticia" stopProcessing="true">
 <match url="^noticia/([^/]+)/?$" />
   <conditions>
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
   </conditions>
 <action type="Rewrite" url="noticia.asp?pag={R:1}" />
</rule>

<rule name="Reescrever url noticia ler" stopProcessing="true">
 <match url="^noticia-ler/([^/]+)/([^/]+)/([^/]+)/?$" />
   <conditions>
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
   </conditions>
 <action type="Rewrite" url="noticia-ler.asp?id={R:1}&data={R:2}&titulo={R:3}" />
</rule>

 

----------------------------------------------------------------------

 

Com estas mudanças a notícia está exibindo certinho. O único detalhe que tô esbarrando é na paginação dentro da página "noticia.asp"

no rewrite.asp, usei minha função URLamigavel no link da paginação, porém exibe um erro no fim da página:

 

"Página 1 de 2 - Primeira Anterior [ 1 ]

Microsoft VBScript runtime error '800a01c2'

 

Wrong number of arguments or invalid property assignment: 'URLamigavel'

 

/noticia.asp, line 181"

 

 

Seguem os códigos referente a paginação (noticia.asp)

 

'------- Coloque aqui a quantidade de registros que você deseja por página --------
SELECT CASE np
CASE "1" NumPorPage = "1"
CASE "15" NumPorPage = "15"
CASE ELSE NumPorPage = "10"
END SELECT
'Const NumPorPage = 20

'Verifica qual a página solicitada
Dim PagAtual

IF Request.QueryString("PagAtual") = "" Then
PagAtual = 1 'Primeira página
Else
PagAtual = Request.QueryString("PagAtual")
End If

RS.CacheSize = NumPorPage 'Define o tamanho do Cache = para o número de registros


RS.MoveFirst 'Move o RecorSet para o início
RS.PageSize = NumPorPage 'Coloca a quantidade de páginas

Dim TotalPages 'Pega o número total de páginas
TotalPages = RS.PageCount

RS.AbsolutePage = PagAtual 'Configura a página atual

'############## paginacao Introdução - FIM #################

Count = 0 'Zera o contador

'Inicia a Função DO, utilizando a quantidade de páginas especificadas
'Ou seja ele irá executar a ação até que o valor Count seja menor que "20" como está no nosso exemplo
%>


<% 
'Enquanto o contador for menor que a quantidade de registros mostrados ou
' não for o final do arquivo
i = 0

DO WHILE NOT RS.EOF And Count < RS.PageSize 'paginacao And Count < RS.PageSize


i = i+1
Count = Count + 1 
%>
<br/>
<font color="#FFF"><a href="noticia-ler.asp?id=<%=rs("id")%>"><%=rs("data")%> - <%=rs("titulo")%></a></font>
<br />
<!--<font color="#FFF"><a  href="<=URLamigavel("noticia-ler.asp?id=1&data=05.06.2011&titulo=Billy-e-Mandy")%>"><=rs("data")%> - <=rs

("titulo")%></a>-->
<br/>
<font color="#FFF"><a  href="<%=urlAmigavel("noticia-ler.asp?id=", rs("id"), rs("data"), rs("titulo"))%>"><%=rs("data")%> - <%=rs

("titulo")%></a></font>
<br/>



<%
RS.MoveNext
LOOP
%>

 

Para resumir vou deixar apenas um dos links de numeração que estou fazendo o teste para não estender muito:

 

If CInt(i) > CInt(PagAtual) Then
       Response.Write "<span id='link'><a href="&URLamigavel("noticia.asp?PagAtual=" & i & "")&">" & i & "</a></span>  "
 END IF
Next

 

 

 

Estou testando todas as possibilidades, se caso encontrar uma solução postarei aqui.

 

 

 

Muito obrigado pela força pessoal!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso pode acontecer ao tentar chamar um método como uma propriedade, ou vice-versa, ou chamando um método de um objeto interno, e passando muitos argumentos.

 

No entanto, a causa mais comum para isso é usando ADODB.Recordset para criar um novo registro,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigos,

 

Estou fazendo alguns testes, mas ainda estou com dúvidas, mantive meu link de paginação sem puxar a função. A paginação exibe outras páginas existentes, porém sem a url amigavel. A URL da paginação secundaria está desta forma:

 

www.meusite.com.br/noticia/noticia.asp?PagAtual=2

 

Não sei se minha pagina da funcao urlamigavel está gerando conflito. Será que meu link de paginação precisa de uma função especifica, tipo seria necessário criar outro arquivo separado com a função?

 

Ou existe um outro modo de reescrever a partir de "noticia.asp?PagAtual=2"

 

Desculpe minha limitação neste processo xanburzum, mas o recordset que você se referiu seria o que estou usando no código da paginação por isso o conflito?

 

Muito obrigado pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

ele esta gerando algum numero de erro para o conflito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo, não sei se apenas comentou, mas por desencargo, você pode trabalhar com os dois arquivos juntos (.htaccess e web.config), mas não declare as mesmas regras em ambos.

 

No seu novo .htaccess, onde:

RewriteRule ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?pag=$2 [i,L]

Altere para:

RewriteRule ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp?PagAtual=$1 [i,L]

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia amigos,

 

Obrigado Public2004, mas tb já tinha feito estas alterações e não funcionou. Tive a mesma sensação de o parametro bater com o .htaccess e o web.config e não deu certo. O que está confuso p mim é aonde preciso mexer no .htaccess, web.config, no rewrite.asp ou na própria pagina noticia.asp? Tentei criar também uma outra página de funcao para reescrever minha url tipo um rewrite-2.asp. utilizando o i usado como contador na paginação como parametro.

 

Só para complementar segue o codigo da nova função paginacao:

 

<%Function  paginacao(param)
paginacao = param
End Function%>

<%Function paginacao(PagAtual, ByVal i)
dim URL, arquivo, parametros, sField, sValue, valor
URL = "http://www.meusite.com.br/"
If InStr(PagAtual, ".asp" ) > 0 Then
arquivo = Left( PagAtual, ( InStr(PagAtual, ".asp" ) -1)  )
If InStr(PagAtual, "?" ) Then
parametros = Split( Right( PagAtual , Len(PagAtual) -  InStr(PagAtual, "?" ) ) , "&")
For j = 0 To UBound( parametros )
sField = left ( parametros(j) , InStr( parametros(j) , "=") -1 )
sValue = Right( parametros(j) , Len(parametros(j)) -  InStr( parametros(j) , "=") )
if valor = "" Then valor = sValue Else valor = valor &","& sValue End If
Next
End if
End if
If i <> "" then
i = "/"& FormataTitulo( i )
'End if
Else
i = "/"
End if
If valor <> "" Then    valor = "-" & valor&".html"    End If
paginacao = URL & arquivo & i 
End Function

 

Esta mudança gerou o mesmo erro anterior com aquela mensagem no rodape da paginação. Só para ilustrar, por gentileza alguem de vcs tem um exemplo de paginação com url amigavel?

 

 

 

Brigadão pela força!

Compartilhar este post


Link para o post
Compartilhar em outros sites

poste como esta seu arquivo htaccess

Compartilhar este post


Link para o post
Compartilhar em outros sites

Atualmente meu .htaccess está dessa forma:

 

[iSAPI_Rewrite]
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L] 
RewriteRule  ^/default/?([a-zA-Z0-9_-]+)?(.html)?$ /default.asp [i,L]
RewriteRule  ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia.asp [i,L]
RewriteEngine On
RewriteRule ^/noticia/?([a-zA-Z0-9_-]+)?(.html)?$ /noticia/noticia.asp?PagAtual=$1 [L]
RewriteRule ^/noticia-ler/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/([a-z,0-9,_-]+)/?$ /noticia-ler.asp\?id=$1&data=$2&titulo=$3 [L]

 

Grato pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.