.htaccess non reindirizza correttamente alla pagina con prefisso www


9

Sto cercando di reindirizzare un URL senza www. a www.version (esempio.com a www.esempio.com). Uso il solito

RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Questo funziona su tutti i miei altri progetti. Tuttavia, in questo particolare sito, termina con un ciclo di reindirizzamento. Ecco la parte strana: ho provato ad arricciare la versione non www per vedere quali intestazioni invia usando curl --get http://example.com --dump-header domain.header > domain.html. Il file di intestazione era simile al seguente:

HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1

Tuttavia, il file HTML risultante era questo:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address>
</body></html>

(nota la differenza di indirizzo tra i file) Qualcuno sa come risolvere questo (e che diavolo lo sta causando)? Qualsiasi altra direttiva di riscrittura degli URL funziona bene.

EDIT: il registro di riscrittura conteneva questo: (il sito accede a molte persone, quindi il registro di riscrittura è diventato piuttosto lungo, non sono sicuro al 100% se questa è la parte giusta)

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] strip per-dir prefix: /var/www/oup/81/ ->
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (3) [perdir /var/www/oup/81/] applying pattern '(.*)' to uri ''
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] rewrite '' -> 'http://www.example.com/'
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (2) [perdir /var/www/oup/81/] explicitly forcing redirect with http://www.example.com/
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] escaping http://www.example.com/ for redirect
192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] [example.com/sid#b797f948][rid#b7d2c1c8/initial] (1) [perdir /var/www/oup/81/] redirect to http://www.example.com/ [REDIRECT/301]

La riga del registro di accesso (probabilmente quella giusta):

192.168.1.221 - - [06/Jun/2011:17:49:32 +0200] "GET / HTTP/1.1" 301 555 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24"

La definizione di virtualhost:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias example.com www.example.com
        DocumentRoot /var/www/example/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/example/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride All
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

EDIT2: okay, ho appena capito che se lo faccio (mi sono dimesso e ho tentato di reindirizzare questo senza .htaccess):

//if clause determining that we're running on example.com and not www.example.com
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com' . $_SERVER['REQUEST_URI']);
header('Connection: close');

Causa ESATTAMENTE LO STESSO ciclo di reindirizzamento. Davvero, che diavolo? Qualcuno ha un'idea di cosa potrebbe essere la causa?


Hai compilato Apache tu stesso o? Dovrebbe essere impossibile per l'intestazione Location differire da ciò che è nella pagina poiché sono presi dalla stessa variabile in questo caso, quindi è piuttosto strano. Presumo che le richieste siano passate direttamente ad Apache, giusto, non c'è nessun altro server in mezzo?
Tim Stone,

Non ho compilato Apache da solo e non c'è nessun altro server in mezzo.

probabilmente il tuo server NS non è configurato correttamente
venimus

4
Non è necessario ripetere il nome del server nella voce ServerAlias.
chris,

puoi mettere qui tutto il contenuto del file
annullato il

Risposte:


2

Ciò che mi colpisce di strano è la Location: http://domain.cz/riga di intestazione riportata da CURL. Non reindirizzi mai a quel dominio. Anche il registro di reindirizzamento non ne contiene alcuna menzione.

In qualche modo l' Locationintestazione sembra essere cambiata dopo che modrewrite ha fatto le sue cose, e dato che hai provato a cambiare l'intestazione anche con PHP, l' Locationintestazione è apparentemente cambiata dopo che la richiesta è stata elaborata. L'unica spiegazione che mi viene in mente è che stai modificando l'intestazione della posizione con mod_header da qualche parte.

Hai controllato tutti i file di configurazione (httpd.conf, i file .conf inclusi e il file .htaccess) se trovi da qualche parte una linea simile a questa:

Header set Location (...)

o

Header edit Location (...)

Non ho trovato niente del genere.

2
Ti stai collegando direttamente ad Apache o c'è qualche cache o server proxy in mezzo che potrebbe cambiare le intestazioni? La direttiva ProxyPassReverse potrebbe anche modificare l'intestazione della posizione ( httpd.apache.org/docs/2.0/mod/mod_proxy.html#ProxyPassReverse ).

potrebbe esserci un po 'di proxy tra di loro, ci darò un'occhiata non appena potrò lavorare domani.

@Jakob Egger - Non ho trovato la direttiva ProxyPassReverse da nessuna parte.
cif

1

Oltre ad abilitare la riscrittura (se si ha accesso per modificare httpd.conf) è necessario rimuovere dall'equazione l'applicazione che risiede su questo sito. Rimuovi / rinomina temporaneamente index.php predefinito (o qualunque pagina indice stia offrendo la tua app) per essere sicuro che non lo stia causando.

Ci sono molti rapporti di applicazioni (ad esempio wordpress) che fanno apparire queste pagine di reindirizzamento predefinite di apache se sono configurate male.

Inoltre, controlla il resto della configurazione di Apache per vedere se ci sono altre istruzioni di "reindirizzamento" che potrebbero essere in conflitto.


L'applicazione va bene, l'ho provata su un server diverso e dominio diverso (ho copiato l'intera app) e ha funzionato bene. Immagino sia qualcosa nella configurazione di Apache, ma non riesco a capire cosa.

L'app potrebbe essere ok, ma potrebbe anche essere in conflitto con l'installazione su questo server. Sembra che la tua app sia attualmente in produzione, quindi posso vedere come disabilitarla non sia l'ideale. Per divertimento, potresti aggiungere una stringa di query alla fine del reindirizzamento come flag per facilitare il rilevamento - quindi / $ 1? Nowww = 1 o qualcosa di simile.
Gavin C,

No, NON è in produzione.

Oh fico, quindi non posso fare male a spostare il file di indice al 100% per escluderlo come parte del problema :)
Gavin C

Oh, dannazione, quello che intendevo scrivere era che è in produzione, non so come sia successo :-)

0

Puoi provare questo codice mod_rewrite alternativo:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Questo fallì esattamente allo stesso modo.

puoi abilitare RewriteLog e vedere cosa sputa.
anubhava,

E esattamente come posso farlo? :-)

Si prega di consultare qui: httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog L' unica cosa è che questa direttiva entra nella configurazione di apache NON in .htaccess.
Anubhava,

1
Ho copiato la stessa regola (come la mia risposta sopra) nella mia installazione di Apache ed ho eseguito lo stesso comando curl che hai nella tua domanda e ho ottenuto Location: http://www.domain.com/come parte delle mie intestazioni, quindi nel mio caso le intestazioni e il codice HTML mostrano entrambi lo stesso dominio, ad es www.domain.com. Puoi anche incollare le righe rilevanti di access.log nella domanda sopra?
anubhava,

0

potresti provare a usare [NC] invece di [nc], potrebbe essere così semplice


Eppure non è :-) (già provato, non ha funzionato)

0

Spero che tu abbia accesso al server, aggiunta la riga di reindirizzamento dopo che la cartella del documento del sito specificata è stata seguita

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.cz [NC]
RewriteRule ^/(.*) http://www.domain.cz/$1 [L,R=301]

Se non si dispone dell'accesso per il server, aggiungere quelle righe su httaccess avviando / cambiando la porzione.

Potrebbe non essere necessario aggiungere "RewriteEngine on" prima del reindirizzamento.


Ho aggiunto RewriteEngine on, come ho detto, che funziona correttamente su un altro server, ma non su questo.

AllowOverride All allow from all aggiungi quelle righe nel tuo file di configurazione del server

0

Provare:

RewriteCond %{HTTP_HOST} ^domain.cz [NC]
RewriteRule (.*) http://www.domain.cz/$1 [R=301,L]

0

Assicurati di avere Options +FollowSymLinksse stai lavorando all'interno di un contesto di directory.

Altrimenti se si utilizzano host virtuali basati sul nome, provare:

<VirtualHost *:80>
  ServerName domain.cz
  Redirect / http://www.domain.cz/
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain.cz
  # whatever else
</VirtualHost>

Ho aggiornato la domanda con la definizione di VirtualHost.

Hai provato la soluzione VirtualHost multipla sopra menzionata o hai impostato l'utilizzo di mod_rewrite?
chris,

All'inizio, non volevo usare più VirtualHosts, ma date le circostanze l'ho provato comunque e non ha aiutato.

0

Dopo aver letto tutte le risposte, puoi controllare il file de / etc / hosts ... forse tutti i tuoi controlli provengono dal tuo computer. Prova ad accedere da un'altra posizione.


No, niente in host su quel dominio.

0

Ho una seconda idea Il registro del server che hai pubblicato mostra un indirizzo di "192.168.1.221", che è un indirizzo della rete locale. Tutte le voci del registro mostrano lo stesso indirizzo IP? In tal caso, esiste un proxy tra l'utente e il server. Questo proxy probabilmente utilizza ProxyPassReverseo Header editper modificare l' Locationintestazione.

Questa è una configurazione normale per aggirare il problema quando il server back-end inserisce il proprio nome host Locationnell'intestazione, anziché il nome host del server proxy esterno.

Se esiste davvero un server proxy, dovrai modificare la configurazione del server proxy anziché la configurazione del server back-end, poiché il proxy sovrascriverà sempre le informazioni.

Ciò significa che abbiamo sempre cercato il server sbagliato: il problema è con il server proxy!


Domani chiamo il supporto tecnico dell'azienda che gestisce questo server. Penso che debba essere così, ti farò sapere.
cif

0

Potrebbero essere caratteri non stampabili come null nel .htaccessfile.

hexdump -C .htaccess

0

Credo che manchi un segno $ dopo la tua condizione di riscrittura. Vi preghiamo di provare:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.cz$
RewriteRule ^(.*)$ http://www.domain.cz/$1 [R=301,L]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.