it-swarm.com.de

Schreiben Sie Platzhalter-Unterdomänen in .htaccess in die entsprechenden Ordner in der Hauptdomäne um, während die Unterdomäne erhalten bleibt

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.

6
aatanasow

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

2
MrWhite