2009-08-04 9 views
18

Uno dei nostri siti ha un URL come questo: example.oursite.com. Abbiamo deciso di spostare il nostro sito con un URL come questo www.oursite.com/example. Per fare ciò, abbiamo scritto una regola di riscrittura nel nostro server Apache che reindirizza al nostro nuovo URL con un codice 301.Reindirizza 301 con parte hash (ancora) #

Molti siti Web ci collegano con URL del modulo example.oursite.com/#id=23. Il problema è che il reindirizzamento cancella la parte hash dell'URL con IE. Per quanto ne so, la parte hash non viene mai inviata al server.

Ho voluto implementare il reindirizzamento con javascript per mantenere la parte hash, ma il motore di ricerca non sarà a conoscenza del fatto che il nostro URL è cambiato. (Nessun codice 301 restituito)

Desidero che il motore di ricerca venga informato del nostro nuovo URL (301) perché è necessario trasferire il grado di pagina al nostro nuovo URL.

C'è un modo per reindirizzare con un codice 301 e mantenere la parte hash (#id=23) nell'URL?

risposta

1

È possibile creare una pagina sul vecchio indirizzo che raccoglie tutte le richieste e reindirizza al nuovo sito con l'indirizzo e il codice corretti.

Ho fatto qualcosa del genere, ma era in asp.net, che immagino non sia la lingua che usi. Ad ogni modo dovrebbe esserci un modo per farlo in qualsiasi lingua.

1

Quando si restituisce lo stato 301, il server deve restituire un'intestazione "Location:" che punta alla nuova posizione. In pratica, il modo in cui questo viene implementato varia; alcuni server forniscono l'URL completo (netloc e percorso), alcuni forniscono solo il nuovo percorso e si aspettano che il browser cerchi quel percorso sul netloc originale. Sembra che la tua regola di riscrittura stia spianando la strada.

Un modo semplice per vedere ciò che l'intestazione posizione restituito è, nella shell Python:

>>> import httplib 
>>> conn = httplib.HTTPConnection('exemple.oursite.com') 
>>> conn.request('HEAD', '/') 
>>> res = conn.getresponse() 
>>> print res.getheader('location') 

ho paura che non so abbastanza di mod_rewrite per dirvi come fare la regola di riscrittura correttamente , ma questo dovrebbe darti un'idea di ciò che il tuo server sta effettivamente dicendo ai clienti di fare.

+0

fantastico, grazie sospettavo che ci fosse una parte percorso/posizione che potevi impostare. Nota per chiunque stia leggendo, è possibile utilizzare anche fidler, wireshark o intestazioni HTTP live. – David

2

Sono quasi certo che la parte di hash/pagina/segnalibro di un URL non è indicizzata dai motori di ricerca e pertanto non ha alcun effetto sul posizionamento della pagina. Fare una ricerca su google per "inurl: #" restituisce zero documenti, quindi ciò conferma la mia ipotesi. I collegamenti da siti esterni verranno indicizzati senza l'hash.

Hai ragione nel senso che la parte hash non viene inviata al server, quindi, per quanto ne so, non c'è un buon modo per essere in grado di creare un url di reindirizzamento con l'hash in esso.

Per questo motivo, è compito del browser gestire correttamente l'hash durante un reindirizzamento. Firefox 3.5 sembra farlo correttamente. Se aggiungi un hash a un URL con un reindirizzamento noto, vedrai la modifica dell'URL nella barra degli indirizzi nella nuova posizione, ma l'hash rimane lì con successo.

Edit: In risposta al commento qui sotto, se non ci non è un simbolo 'cancelletto nella URL esterno per la parte che vi serve, allora è del tutto possibile riscrivere l'URL.Una regola di riscrittura Apache avrebbe prendersi cura di esso:

RewriteCond %{HTTP_HOST} !^exemple\.oursite\.com [NC] 
RewriteCond %{HTTP_HOST} !^$ 
RewriteRule ^/(.*)   http://www.oursite.com/exemple/$1 [L,R] 

Se non si utilizza Apache, allora si dovrà esaminare la documentazione di server per qualcosa di simile.

+0

Hai ragione, SE non indicizza la parte hash. Ma, ad esempio, qualcuno sul suo sito web potrebbe pubblicare un link a un video sul nostro sito. (Exemple.oursite.com/video_id=233) Il link dovrebbe continuare a funzionare per consentire al websurfer di riprodurre il nostro video, ma la classifica su exemple.oursite. com deve essere trasferito a www.oursite.com/exemple –

+0

L'esempio che hai appena inserito nel tuo commento manca di un cancelletto, quindi è molto diverso dalla tua domanda originale. Se questo è l'URL che vuoi riscrivere, allora è possibile e aggiornerò la mia risposta. Dovresti chiarire la tua domanda se questo è il caso. – zombat

+1

Google ignora "#". Prova a cercare "#" (senza virgolette) in google ... quindi il test inurl: # non è valido. – David

0

Ho registrato il mio account in modo che non possa essere modificato.

zombat: Mi dispiace ho fatto un errore nel mio commento. Il link al nostro video è exemple.oursite.com/#video_id=233. In questo caso, la mia regola di riscrittura in Apache non funziona.

Nick Berardi: Abbiamo cambiato il modo in cui funzionano i nostri collegamenti. Non usiamo più #, solo per compatibilità all'indietro

+0

Sei praticamente su un torrente con una pagaia sulla comparabilità all'indietro. L'unico modo in cui ti vedo reindirizzare l'utente è tramite JavaScript, tuttavia non risolverà il problema del tuo bot di ricerca, ma come altri hanno affermato che il bot di ricerca riguarda solo la parte dell'URL che è richiesta, che non include il tag hash. –

0

Ai bot di ricerca non interessa i tag hash. E se li usi per qualche tipo di chiamate flash o AJAX, hai problemi più seri di quelli che i tuoi reindirizzamenti 301 non funzionano. Perché a meno che tu non abbia il contenuto in una forma alternativa, i motori di ricerca non stanno indicizzando il tuo sito e sicuramente stai soffrendo per quanto riguarda la SEO.

+0

Il rovescio della medaglia è che puoi contare sulla non indicizzazione SE dell'hash per canonizzare contenuti simili (rand fishkin fa una spiegazione decente qui: http://www.seomoz.org/blog/whiteboard-friday- using-the-hash) e quindi fare affidamento su js per fare il tuo tracking – TMG

1

Visto che il server non vedrà mai la # (escludendo Redirect 301) e Google ha deprecato il loro AJAX Crawling scheme, sembra che una soluzione front-end sia l'unico modo!

Come ho fatto:

(function() { 

    var redirects = [ 
     ['#!/about',   '/about'], 
     ['#!/contact',  '/contact'], 
     ['#!/page-x',  '/pageX'] 
    ] 

    for (var i=0; i<redirects.length; i++) { 
     if (window.location.hash == redirects[i][0]) { 
      window.location.replace(redirects[i][1]); 
     } 
    } 

})(); 

sto supponendo che perché crawler di Google effettivamente eseguire JavaScript, le nuove pagine verranno indicizzate correttamente.

L'ho inserito in un tag <script> direttamente sotto il tag <title>, in modo che venga eseguito prima di qualsiasi altro JS/CSS. Nota che questo script dovrebbe essere richiesto solo per il tuo file di indice.

+0

Questo ha funzionato correttamente e preservando il SEO? –

+0

I reindirizzamenti funzionano correttamente, non posso dire con certezza se ha funzionato per SEO – AlexKempton

Problemi correlati