Ich versuche, eine Unterdomäne in einen Ordner/eine Datei wie folgt umzuschreiben:
name.example.com
-> example.com/profile/name
foo.example.com
-> example.com/profile/foo
xyzzy.example.com
-> example.com/profile/xyzzy
Dies ist eine Platzhalter-Unterdomäne, die auf denselben Ordner wie die Hauptdomäne verweist.
Ich habe diesen Code in .htaccess auf dem Hauptdomänenstamm:
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]
Es funktioniert gut, aber ich möchte die ursprüngliche URL behalten: name.example.com
Ich habe einen internen Serverfehler, wenn ich versuche, die letzte Zeile in zu ändern
RewriteRule (.*) /profile/%1/ [L]
Ich habe ein paar verschiedene Lösungen ausprobiert, ohne Erfolg. Offensichtlich mache ich es falsch.
Wie kann ich die ursprüngliche URL behalten?
Bearbeiten:
# 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
Es ist nicht optimiert, aber das Problem ist, dass alles zwischen # BEGIN WordPress
und # END WordPress
von Wordpress überschrieben werden kann. Aus diesem Grund möchte ich dort nichts ablegen.
Ich habe einen internen Serverfehler, wenn ich versuche, die letzte Zeile in zu ändern
RewriteRule (.*) /agents/%1/ [L]
Dies führt nämlich zu einer internen Überschreibungsschleife. Anscheinend möchten Sie auch den URL-Pfad beibehalten (weshalb Sie vermutlich das Muster RewriteRule
erfassen - das jedoch gerade verworfen wird).
Sie benötigen eine zusätzliche Bedingung, um eine Umschreibeschleife zu verhindern und die Ersetzung RewriteRule
zu ändern. Zum Beispiel:
# profile redirection
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule (.*) /profile/%1/$1 [L]
Durch das Abgleichen mit einer leeren Umgebungsvariablen (REDIRECT_STATUS
) wird sichergestellt, dass nur die ursprüngliche Anforderung und nicht die neu geschriebene Anforderung neu geschrieben wird.
Dies setzt auch voraus, dass die Unterdomänen und die Hauptdomäne alle auf dieselbe Stelle im Dateisystem verweisen (wie in den Kommentaren von @Stephen angegeben).
$1
ist ein Rückverweis auf die erfasste Gruppe im Muster RewriteRule
.
Alternativ können Sie ein negiertes RewriteRule
Muster verwenden und nur Anforderungen neu schreiben, die /profile/
nicht bereits starten, und die Servervariable REQUEST_URI
verwenden stattdessen in der Ersetzung (wie Sie es in der kanonischen Umleitung tun). Zum Beispiel:
# profile redirection
RewriteCond %{HTTP_Host} ^(.+)\.example\.com [NC]
RewriteRule !^profile/ /profile/%1%{REQUEST_URI} [L]
Die Prüfung gegen REDIRECT_STATUS
ist nicht erforderlich.
Dies verhält sich sehr ähnlich wie der erste Regelblock, mit Ausnahme einer RewriteCond
-Direktive weniger. Eine leichte Einschränkung bei diesem Ansatz ist jedoch, dass Sie keinen angeforderten URL-Pfad haben können, der auch /profile/
startet (dh der einem Dateisystempfad wie /profile/profile/
zugeordnet ist) - obwohl ich mir das so vorstelle unwahrscheinlich.
UPDATE: Da Sie WordPress verwenden, ist es wahrscheinlich, dass WordPress selbst eine externe Weiterleitung zurück in die kanonische Domäne auslöst, z. example.com
(wie durch die WP_HOME
PHP-Konstanten definiert). Um dies zu verhindern, können Sie versuchen, die Konstanten WP_SITEURL
und WP_HOME
dynamisch in wp-config.php
so festzulegen, dass sie auf den Hostnamen verweisen ( dh die angeforderte Unterdomäne, anstatt in die Hauptdomäne fest codiert zu werden.
Zum Beispiel:
define('WP_SITEURL','http://'.$_SERVER['HTTP_Host']);
define('WP_HOME','http://'.$_SERVER['HTTP_Host']);
(Hinweis: Dies setzt HTTP anstelle von HTTPS voraus.)
Referenz:
https://codex.wordpress.org/Editing_wp-config.php#WP_SITEURL