web-dev-qa-db-fra.com

Réécrire les sous-domaines génériques dans .htaccess dans les dossiers correspondants du domaine principal tout en préservant le sous-domaine.

J'essaie de réécrire un sous-domaine dans un dossier/fichier comme ceci:

  • name.example.com -> example.com/profile/name
  • foo.example.com -> example.com/profile/foo
  • xyzzy.example.com -> example.com/profile/xyzzy

Il s'agit d'un sous-domaine générique pointant vers le même dossier que le domaine principal.

J'ai ce code en .htaccess sur la racine du domaine principal:

RewriteEngine On
RewriteBase /

#force https and non-www
RewriteCond %{HTTP_Host} ^(www\.)(.+) [OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_Host} ^(www\.)?(.+)
RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]

# profile redirection
RewriteCond %{HTTP_Host} ^(.*)\.example\.com [NC]
RewriteRule (.*) https://example.com/profile/%1/ [L]

Cela fonctionne bien mais je veux conserver l'URL d'origine: name.example.com

J'ai une erreur interne du serveur lorsque j'essaie de modifier la dernière ligne en

RewriteRule (.*) /profile/%1/ [L]

J'ai essayé plusieurs solutions différentes sans succès. Évidemment, je le fais mal.

Comment puis-je conserver l'URL d'origine?

Edit:


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Il n’est pas optimisé, mais le problème est que tout ce qui se situe entre # BEGIN WordPress et # END WordPress peut être écrasé par Wordpress. C'est pourquoi je ne veux rien y mettre.

6
aatanasow

J'ai une erreur interne du serveur lorsque j'essaie de modifier la dernière ligne en

RewriteRule (.*) /agents/%1/ [L]

Cela entraînerait une boucle de réécriture interne. Il semble que vous souhaitiez également conserver le chemin d'URL (ce qui explique probablement pourquoi vous capturez le motif RewriteRule - mais qui est actuellement ignoré).

Vous avez besoin d'une condition supplémentaire pour empêcher une boucle de réécriture et modifier la substitution RewriteRule. Par exemple:

# profile redirection
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule (.*) /profile/%1/$1 [L]

Le contrôle par rapport à un REDIRECT_STATUS (variable d'environnement) vide garantit que seule la demande initiale est réécrite, et non la demande réécrite.

Cela suppose également que les sous-domaines et le domaine principal pointent tous au même emplacement sur le système de fichiers (comme l'a demandé @Stephen dans les commentaires).

$1 est une référence au groupe capturé dans le modèle RewriteRule.


Vous pouvez également utiliser un modèle RewriteRule négatif et ne réécrire que les demandes qui ne démarrent pas déjà /profile/ et utiliser la variable de serveur REQUEST_URI. dans la substitution à la place (comme vous le faites dans la redirection canonique). Par exemple:

# profile redirection
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule !^profile/ /profile/%1%{REQUEST_URI} [L]

La vérification sur REDIRECT_STATUS n'est pas requise.

Cela se comporte de manière très similaire au premier bloc de règles, à l'exception d'une directive less RewriteCond. Cependant, une légère mise en garde avec cette approche est qu’il est impossible d’avoir un chemin d’URL demandé qui démarre également /profile/ (c’est-à-dire qui mappe sur un chemin de système de fichiers tel que /profile/profile/) - bien que j'imagine que c'est peu probable.


UPDATE: Puisque vous utilisez WordPress, il est probable que WordPress lui-même déclenche une redirection externe vers le domaine canonique, par exemple. example.com (tel que défini par les constantes WP_HOME PHP). Pour éviter cela, vous pouvez essayer de définir les constantes WP_SITEURL et WP_HOME de manière dynamique dans wp-config.php pour qu'elles pointent vers le nom d'hôte ( c'est-à-dire le sous-domaine) demandé, au lieu d'être codé en dur dans le domaine principal.

Par exemple:

define('WP_SITEURL','http://'.$_SERVER['HTTP_Host']);
define('WP_HOME','http://'.$_SERVER['HTTP_Host']);

(NB: Cela suppose HTTP plutôt que HTTPS.)

Référence:
https://codex.wordpress.org/Editing_wp-config.php#WP_SITEURL

2
MrWhite