Apache RewriteRule de supprimer le port sur n'importe quel nom de domaine
J'ai un serveur virtuel avec une adresse IP, au service d'un nombre de différents sites. L'un d'eux dispose d'un certificat SSL.
J'ai besoin d'ajouter un certificat SSL sur un second domaine pour un usage privé par moi-même, et comme je n'ai qu'une adresse IP, je l'ai ajouté sur le port 8080 au lieu. Cela fonctionne très bien.
Mon problème maintenant est que tous les domaines qui pointent vers le serveur d'affichage de mon site privé si le port 8080 est demandé sur ce domaine.
https://example1.com:8080/-> will show my private site, but shouldn't
https://example2.com:8080/-> will show my private site, but shouldn't
https://desired-domain.com:8080/-> will show my private site, this is correct!
Tous les visiteurs de https://example1.com:8080/
devraient être redirigé vers http://example1.com/
, et de même pour example2.com
.
J'ai essayé...
RewriteCond %{HTTP_HOST} !desired\-domain\.com [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1 [L,R=301]
...mais le port est ajouté à HTTP_HOST, il sort comme http://example1.com:8080/
Donc, en bref, ma question: comment puis-je rediriger vers l'hôte, mais ignorer la demande de port?
SUPPLÉMENTAIRE
J'ai essayé cette...
RewriteCond %{HTTP_HOST} !(desired-domain.com):8080$ [NC]
RewriteRule ^(.*)$ http://%1$1 [L,R=301]
...mais il redirige vers http://localhost/
. C'est mieux que de montrer la mauvaise page du site, même si, comme personne ne devrait être en demandant le port 8080 sur n'importe quel autre domaine de toute façon!
Je pense qu'il y a de mieux "desired-domain.com' regex, mais ma regex mojo n'est pas coule aujourd'hui.
Peut-être spécifier explicitement le port 80 œuvres:
RewriteRule ^(.*)$ http://%{HTTP_HOST}:80$1 [L,R=301]
au lieuMerci @Gerben, j'ai essayé ça mais ça donne juste
http://example1.com:8080:80/
!
OriginalL'auteur JoLoCo | 2012-03-08
Vous devez vous connecter pour publier un commentaire.
Peut-être essayer:
Évidemment, vous aurez besoin d'être un peu intelligent à propos de votre HTTP_HOST expression régulière, si il n'y a pas de moyen facile d'encapsulation de votre exemple1 et exemple2 domaines au sein d'une seule regex, vous pouvez avoir 2 d'hier et d'utiliser le [OU]:
EDIT:
Vous ne pouvez pas correspondre à une référence arrière comme
!(desired-domain.com):8080$
, comme le ! signifie qu'il ne correspond pas. Mais vous pouvez essayer quelque chose comme ceci:%1
n'est pas redirigé vers le nom de domaine à la demande des utilisateurs, il redirige le nom de domaine défini sur le serveur donc c'est la même chose que moi spécification d'un domaine dans la règle de réécriture. Le RewriteCond de plus facile que de peu, cela fonctionne très bien!L' %1 est une référence arrière à un match dans RewriteCond, donc que ce soit adapté dans le précédent RewriteCond de parenthèses () peut être référencé par %1 %2, %3, %4, etc) tout comme le $1 références arrières un match dans les règles de réécriture.
dans la deuxième solution %1 sera vide si le http_host n'est pas example.com. C'est à cause %1 ne backreference la dernière condition, pas la dernière correspondance.
Bizarre, il fonctionne dans mon fichier htaccess, apache 2.2.21-r1
Si c'est un reg exp ^(example1.com):8080$ le point signifie que chaque personnage. Peut-être que vous voulez y échapper? ^(example1\.com):8080$
OriginalL'auteur Jon Lin