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.
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