PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   Apache HTTP-Server (http://www.selfphp.de/forum/forumdisplay.php?f=23)
-   -   mod_rewrite + wildcard + Subdomains (http://www.selfphp.de/forum/showthread.php?t=25085)

otto888 09.10.2013 17:21:16

mod_rewrite + wildcard + Subdomains
 
Hallo

einfache mod_rewrite-Anweisungen konnte ich bisher immer selbst erstellen.
Jedoch breche ich mir bei dieser Sache die Ohren.

Ich habe eine domain mit wildcard-Subdomains

Beispiel
www.domain.de

Subdomain, die läuft:
main.db.domain.de

Das "main" kann ich beliebig tauschen oder erweitern - funzt immer:

Beispiele:
de.db.domain.de funzt!
cn.db.domain.de funzt!
en.db.domain.de funzt!
p.123.de.domain.de funzt!
f.123.de.domain.de funzt!
...

Dort habe ich ein Datenbankscript (script.php) laufen, welches folgende Parameter erwartet:
lang (Sprache)
id_art (p/f)
id (eine ID)


Wenn jemand folgende url eingibt, hätte ich gern, daß sich die url im Browser "nicht" ändert,
aber das script "script.php" aufgerufen wird.

Also jemand gibt z.B. ein:

Beispiel1:
p.123.de.domain.de
Dabei soll das Script "script.php" aufgerufen werden und die Angaben aus der url ausgewertet werden können.
also: script.php?id_art=p&id=123&lang=de

Beispiel2:
f.456.cn.domain.de
Dabei soll das Script "script.php" aufgerufen werden und die Angaben aus der url ausgewertet werden können.
also: script.php?id_art=f&id=456&lang=cn

Hier weiß ich nicht einmal ansatzweise, wie ich mod_rewrite in der .htacess einrichte.

Vielleicht kann mir jemand einen "Schubser" in die richtige Richtung geben.

Vielen Dank schon jetzt!

meikel (†) 09.10.2013 20:34:01

AW: mod_rewrite + wildcard + Subdomains
 
Zeige sicherheitshalber noch mal Deinen Virtualhosteintrag.

Dein Vorhaben wäre mit PHP bequemer umzusetzen:
PHP-Code:

echo $_SERVER["HTTP_HOST"]; 

oder
PHP-Code:

echo $_SERVER["SERVER_NAME"]; 

Mit ner Switch-Case Fallentscheidung kannst Du relativ einfach die aktuelle Domain ermitteln oder im Fehlerfalle eine Fehlerseite anzeigen.

btw: verwende zur Erklärung immer *.example.com oder *.example.net. Die Domains existieren und dienen als Beispieldomains, wenn jemand was erklären möchte.

domain.de gehört einer Firma:
Code:

Domain: domain.de
Status: connect
Changed: 2013-01-03T14:55:34+01:00

[Tech-C]
Type: ROLE
Name: InterNetWire Hostmaster
Address: InterNetWire Communications GmbH
Address: Wilhelm-Wagenfeld-Str. 20
PostalCode: 80807
City: Muenchen
CountryCode: DE
Phone: +49 89 550610
Fax: +49 89 55061199
Email: service@internetwire.de
Changed: 2006-02-22T15:23:29+01:00


otto888 09.10.2013 22:31:19

AW: mod_rewrite + wildcard + Subdomains
 
Vielen Dank!
Ja - daran dachte ich auch schon - möchte aber nicht, daß eine Umleitung mit den Parametern sichtbar ist
und es für die Suchmaschinen so aussieht - insbes. Baidu - daß es sich um die Rootdatei handelt.
Mir ist aufgefallen, daß Baidu Rootseiten und Rootseiten von Subdomains indexieren.
Unterseiten dagegen nicht oder halt nur, wenn sich der Server auf dem chinesischen Festland befindet.
Was meinst Du mit "Zeige sicherheitshalber noch mal Deinen Virtualhosteintrag."?
Ich betreibe einen Virtual Server Managed 5.0 L bei Hosteurope

meikel (†) 10.10.2013 16:11:49

AW: mod_rewrite + wildcard + Subdomains
 
Zitat:

Zitat von otto888 (Beitrag 145621)
Ja - daran dachte ich auch schon - möchte aber nicht, daß eine Umleitung mit den Parametern sichtbar ist

Die ist bei switch-case nicht sichtbar:
PHP-Code:

switch($_SERVER["SERVER_NAME"]){
  case 
'de.db.example.com':
     include 
__dir__ '/domain1.php';
     break;
  case 
'cn.db.example.com':
     include 
__dir__ '/domain2.php';
  default:
     include 
__dir__ '/404.php';


Zitat:

Was meinst Du mit "Zeige sicherheitshalber noch mal Deinen Virtualhosteintrag."?
Er sollte ungefähr so aussehen:
Code:

<virtualhost 1.2.3.4:80>
  ServerName "example.com"
  ServerAlias "*.example.com"
...
</virtualhost>

Zitat:

Ich betreibe einen Virtual Server Managed 5.0 L bei Hosteurope
Der verwendet Plesk. Da hast Du etwas Arbeit, dem Teil ne catch-all Domain unterzujubeln:
vhost.conf erzeugen bzw. editieren und
Code:

/usr/local/psa/admin/bin/httpdmng --reconfigure-domain example.com
Ist allerdings abhängig von der Plesk Version.

otto888 10.10.2013 16:40:41

AW: mod_rewrite + wildcard + Subdomains
 
OK - Vielen Dank,
habe es nun so gelöst:

htaccess:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^main.db.domain.de$ [NC]
RewriteCond %{REQUEST_URI} !^/(css|js|images)(/.*)?
RewriteRule ^ script.php [QSA,L]

1. Rewrite anschalten
2. betrifft nicht main.db.domain.de
3. betrifft nicht Dateien, die sich in den Ordnern "css", "js", "images" befinden
4. Weiterleitung zum Script: script.php

Dort werte ich mittels PHP
$_SERVER["HTTP_HOST"]
aus und verhindere ungültige und ungewollte Aufrufe.
$_SERVER["HTTP_HOST"] zeigt mir z.B.: http://f12345.cn.db.domain.de/

Für alle, die es interessiert:

PHP:
// Weiterleitung falls hier nicht erwünscht
function wech_hier(){
$url_neu = "http://main.db.domain.de"; //falls umgeleitet wird
header ('HTTP/1.1 301 Moved Permanently');
header ("Location: ".$url_neu);
exit();
}

// die ID ohne "p" oder "f" als Array übergeben
// Für jede einzelne Ziffer wird geprüft, ob es eine Zahl ist.
function is_numeric_array($array) {
foreach ($array as $key => $value) {
if (!is_numeric($value)) return false;
}
return true;
}

// Punkte in der Domain zählen
$anz_punkt = substr_count($_SERVER["HTTP_HOST"], "."); //anzahl punkt

$teile = explode(".", $_SERVER["HTTP_HOST"]);

$ai = $teile[0];
$la = $teile[1];
$sd = $teile[2];
$hd = $teile[3];
$su = $teile[4];

// Url falsche eingegeben oder damit rumgespielt
// Bei dieser Konfiguration darf der Aufruf nur 4 Punkte enthalten --> ansonsten ungültig --> Weiterleitung
if ($anz_punkt == "4"){
} else{
wech_hier(); //irgendwas stimmt mit der url nicht Punkte nicht = 4
}

// Kein Teil zwischen den Punkten darf leer sein --> ansonsten ungültig --> Weiterleitung
if (($ai == "")||($la == "")||($sd == "")||($hd == "")||($su == "")){
wech_hier(); // irgendein Teil ist leer!
} else{}

// Die einzelnen Inhalte der URL werden auf gültige Werte geprüft
if ($su == "de"){
} else {
wech_hier(); // su != "de"
}

if ($hd == "domain"){
} else {
wech_hier(); // hd != "domain"
}


if ($sd == "db"){
} else {
wech_hier(); // sd != "db"
}


if (($la == "de")||($la == "cn")){
} else {
wech_hier(); // la nicht erlaubt
}


//Trennen von "p" oder "f" von ID
$id = substr($ai, 1);

//Übergabe von ID als Array an funktion
$id_array = array();
for($i=0; $i<strlen($id); $i++){
$id_array[] = $id{$i};
}

//Übergabe von ID als Array an Funktion und Auswertung
if (is_numeric_array($id_array)) {
} else {
wech_hier(); // id ist keine Zahl
}

So - das funktioniert bei mir.
Nochmal Vielen Dank für die Hilfe und Tipps.

Weiß jetzt nicht, wie man diesen Beitrag als beendet deklariert.


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:44:39 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.