J'essaie de rediriger une URL sans www. à www.version (exemple.com à www.exemple.com). J'utilise l'habituel
RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Cela fonctionne sur tous mes autres projets. Cependant sur ce site particulier, il se termine par une boucle de redirection. Voici la partie bizarre: j'ai essayé de boucler la version non www pour voir quels en-têtes elle envoie en utilisant
curl --get http://example.com --dump-header domain.header > domain.html
. Le fichier d'en-tête ressemblait à ceci:
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
Cependant, le fichier HTML résultant était le suivant:
<!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>
(notez la différence d'adresse entre les fichiers) Quelqu'un sait-il comment résoudre ce problème (et qu'est-ce qui le provoque)? Toute autre directive de réécriture d'URL fonctionne correctement.
EDIT: le journal de réécriture contenait ceci: (le site est accessible à beaucoup de gens, donc le journal de réécriture est assez long, je ne suis pas sûr à 100% si c'est la bonne partie)
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 ligne du journal d'accès (probablement la bonne):
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 définition de l'hôte virtuel:
<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: d' accord, je viens de comprendre que si je fais cela (démissionné et tenté de rediriger cela sans .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');
Cela provoque EXACTEMENT LA MÊME boucle de redirection. Sérieusement, c'est quoi ce bordel? Quelqu'un at-il une idée de ce qui pourrait éventuellement causer cela?
la source
Réponses:
Ce qui me semble étrange, c'est la
Location: http://domain.cz/
ligne d'en-tête signalée par CURL. Vous ne redirigez jamais vers ce domaine. Le journal de redirection n'en contient aucune mention.D'une manière ou d'une autre, l'en-
Location
tête semble être modifié après que modrewrite ait fait son travail, et puisque vous avez également essayé de changer l'en-tête avec PHP, l'en-Location
tête est apparemment changé après le traitement de la demande. La seule explication à laquelle je peux penser est que vous modifiez l'en-tête d'emplacement avec mod_header quelque part.Avez-vous vérifié tous les fichiers de configuration (httpd.conf, les fichiers .conf inclus et le fichier .htaccess) si vous trouvez quelque part une ligne similaire à celle-ci:
ou
la source
En plus d'activer la réécriture (si vous avez accès pour modifier httpd.conf), vous devez supprimer l'application qui réside sur ce site de l'équation. Supprimez / renommez temporairement le fichier index.php par défaut (ou la page d'index qui sert votre application) pour être sûr que cela ne cause pas cela.
Il existe de nombreux rapports d'applications (par exemple wordpress) qui font apparaître ces pages de redirection par défaut apache si elles sont mal configurées.
Vérifiez également le reste de la configuration d'apache pour voir s'il existe d'autres instructions de «redirection» qui pourraient être en conflit.
la source
Pouvez-vous essayer ce code alternatif mod_rewrite:
la source
Location: http://www.domain.com/
partie de mes en-têtes donc dans mon cas, les en-têtes et html montrent tous les deux le même domaine, c'est-à-direwww.domain.com
. Pouvez-vous également coller les lignes access.log pertinentes dans votre question ci-dessus?pourriez-vous essayer d'utiliser [NC] au lieu de [nc], pourrait être si simple
la source
J'espère que vous avez accès au serveur, ajouté la ligne de redirection après le dossier de documents du site spécifié suivi
Si vous n'avez pas accès au serveur, ajoutez ces lignes sur httaccess en commençant / modifiez la partie.
Peut-être n'avez-vous pas ajouté "RewriteEngine on" avant la redirection.
la source
RewriteEngine on
, comme je l'ai dit, que cela fonctionne correctement sur un autre serveur, mais pas sur celui-ci.Essayer:
la source
Assurez-vous de l'avoir
Options +FollowSymLinks
si vous travaillez dans un contexte d'annuaire.Sinon, si vous utilisez des hôtes virtuels basés sur le nom, essayez:
la source
Après avoir lu toutes les réponses, vous pouvez vérifier le fichier de / etc / hosts ... peut-être que toutes vos vérifications proviennent de votre ordinateur. Essayez d'accéder à partir d'un emplacement différent.
la source
J'ai une deuxième idée. Le journal du serveur que vous avez publié affiche une adresse "192.168.1.221", qui est une adresse du réseau local. Toutes les entrées de journal affichent-elles la même adresse IP? Si tel est le cas, il existe un proxy entre vous et le serveur. Ce proxy utilise probablement
ProxyPassReverse
ouHeader edit
pour changer l'en-Location
tête.Il s'agit d'une configuration habituelle pour contourner le problème lorsque le serveur principal place son propre nom d'hôte dans l'en-
Location
tête, plutôt que le nom d'hôte du serveur proxy externe.S'il existe réellement un serveur proxy, vous devrez modifier la configuration du serveur proxy plutôt que la configuration du serveur principal, car le proxy remplacera toujours les informations.
Cela signifie que tout le temps nous avons regardé le mauvais serveur: Le problème est avec le serveur proxy!
la source
Il peut s'agir de caractères non imprimables comme null dans le
.htaccess
fichier.la source
Je crois qu'il vous manque un signe $ après votre condition de réécriture. S'il vous plaît essayez:
la source