[php] Subdomeinen maken

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Eigenlijk is [php] veel te specifiek voor mijn vraag, maar goed.

Ik ben bezig met subdomeinen voor een website in de vorm:
www.url.nl/gebruikersnaam

De gebruiker met naam gebruikersnaam heeft niet fysiek een map op het systeem, en als deze url wordt aangeroepen moet hij worden doorgestuurd naar een profiel.php?naam=gebruikersnaam

Nu heb ik op dit moment het volgende in een .htaccess in mijn root staan:

code:
1
redirect 303 /maarten http://www.kindertent.nl/profiel.php?n=maarten


En dit voor elke gebruiker. Nu kunnen gebruikers hun eigen profiel activeren, en dus ook een nieuw subdomein aanmaken. Aangezien het er naartoe moet dat er duizenden van dit soort subdomeinen zijn, lijkt me dit niet zo'n snelle oplossing en waarschijnlijk krijgt de server het er erg moeilijk mee.

Ik heb ook nog geprobeerd om alle 404 errors door te sturen naar redirect.php en daarin:
PHP:
1
print "referer=".getenv("HTTP_REFERER");


Maar de referer wordt alleen geprint als ik deze pagina via een link bezoek. Hieruit kan ik mijn gebruikersnaam dus niet filteren.

Heeft iemand een idee hoe ik op een niet server belastende manier toch makkelijk
een grote hoeveelheid 'subdomeinen' kan aanmaken?

Ik blijf er iig vrij nuchter onder....


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Ik weet er zelf ook niet het fijne van, maar kijk eens in de docs onder vhost_mod_alias ofzoiets en naar mod_rewrite (voor Apache, that is).

Rustacean


  • _DeWie_
  • Registratie: November 2001
  • Laatst online: 10-04 16:23
Je kunt gewoon alle 404 errors afvangen gevraagde url analyseren en dan doorsturen.
Wat ook kan is het gebruik van mod_rewrite zie apache handleiding

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
DeWie, je bedoelt in de httpd.conf

ik zat zelf te denken aan: ErrorDocument 404 http://url.com/redirect.php?n=CALLED_DOC, maar volgens mij bestaat er niet zo'n algemene variabele Called_doc.

maar MOD_REWRITE ziet er veel belovend uit, daar ga ik eens mee aan de gang.

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Goed, ik ben er een middagje mee bezig geweest. Heb me ingelezen in mod_rewrite en ben tot dit gekomen:

code:
1
2
3
4
RewriteEngine on
RewriteCond   %{REQUEST_URI} !-d
RewriteCond   %{REQUEST_URI} !-f
RewriteRule   ^(.+)  http://www.url.nl/redirect.php?name=$1


Wat moet ie nu doorsturen:
Elke request op http://www.url.nl waarvoor geld:
- de gezochte url is geen bestaand bestand of map.

Maar wat hij nu doet is alle bestanden na: www.url.nl doorsturen naar redirect.php als variabele.

Die check met !-d en !-f lijken helemaal niet te werken.

Ik blijf er iig vrij nuchter onder....


Verwijderd

http://httpd.apache.org/d..._rewrite.html#RewriteRule
onderaan staan nog allemaal voorbeelden...

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ja, maar RewriteRule werkt prima bij mij.

Omdat de mappen die ik als subdomeinen wil gebruiken niet fysiek op het systeem aanwezig zijn, wil ik met de RewriteCond testen of die map bestaat. Zo niet, stuur de gebruiker dan door naar profiel.php?naam=NAAM_VAN_NIET_BESTAANDE_MAP
Anders moet hij gewoon het bestaande bestand aanroepen.

Ik blijf er iig vrij nuchter onder....


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
ErrorDocument 404 redirect/rdr.php
en dan met php maar eens echo $_SERVER["REQUEST_URI"] doen (die laatse is de I van Isaac en geen L). Maar succes.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 26-08 21:52
Dat kan inderdaad met mod_rewrite. Ik heb mod_rewrite laatst zelf gebruikt om mappen af te schermen en via een PHP te lijden. Mod_rewrite is niet echt makkelijk te installeren en je moet er kennis van Regular Expressions (=regex) voor hebben :) Zeker het proberen waard.

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Dat heb ik ook al geprobeerd, en dat werkt niet, want REQUEST_URI wordt in dit geval altijd: redirect.php

Ik blijf er iig vrij nuchter onder....


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Ik heb dit in mijn httpd.conf staan en werkt goed:

code:
1
2
3
<IfModule mod_alias.c>
     AliasMatch ^/\~([a-zA-Z0-9]+) G:/Apache/htdocs/index.php\?$1
</IfModule>


Dit zorgt er dus voor dat alles in de vorm localhost/~user naar localhost/index.php?user wordt doorgestuurd.
Dit kun je dus geheel naar eigen wensen aanpassen en eventuele bestaande mappen in je regex erbij zetten zodat hij daar niet op doorstuurt.

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 15-08 20:11
Maar httpd.conf is niet altijd een optie. Niet iedereen heeft toegang tot dit. htaccess is dus de beste optie.

Moet het trouwens niet -d zijn ipv !-d :?

edit:
Ben op vakantie, reply dus niet meer...

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
code:
1
2
3
<IfModule mod_alias.c>
     AliasMatch ^/\~([a-zA-Z0-9]+) G:/Apache/htdocs/index.php\?$1
</IfModule>



Dit zou in principe kunnen, maar het is noodzakelijk dat elke gebruiker naar zijn profiel kan via: http://www.url.nl/gebruikersnaam

En niet met ~gebruikersnaam.

Als ik de ~ weghaal moet ik dus alle bestaande mappen in de regexp zetten. Dat ga ik zo even proberen.

-d werkt ook niet.

Limhes> Limhes, het werkt in principe, maar dan zonder $1 mee te geven aan de url. Ik stuur nu gewoon alle bestanden door naar redirect.php en vraag daar de REQUEST_URI op. Dat werkt nu wel, in tegenstelling tot eerder in dit topic. Nu nog die ~ eruit werken en de bestaande mappen negeren.

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik heb nu de volgende regel toegevoegd:

AliasMatch ^/([^(images)(fotos)(muziek)^\.]+) /opt/content/kindertent.nl/HTML/redirect.php

Het wordt echter een stuk ingewikkelder, omdat ik de ~ eruit heb gehaald. Hij gaat nu alle bestanden doorsturen naar redirect.php.

Als ik deze regexp gebruik: ^/([^(images)(fotos)(muziek)]+) dan slaat hij de mappen: images,fotos,muziek over. Maar dan zit ik nog steeds met andere bestanden.

Nu dacht ik, elk bestand heeft een (.), tenminste bij mij. Dus als ik nou alle bestanden met een (.) negeer in de regexp. Dat heb ik gedaan in de bovenste regexp, maar dat werkt dus niet. Waarschijnlijk omdat ik gewoon slecht ben met regexpen :-)

Weet iemand hoe je 2 condities kan koppelen in een regexp?

Ik blijf er iig vrij nuchter onder....


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

* drm wist niet eens dat je haakjes mocht gebruiken binnen [ ] :D

maar in dat geval kun je gewoon
code:
1
^/[^(images)(fotos)(muziek).])
gebruiken volgens mij. Maar dan zit je met 't probleem dat een username ook een punt kan bevatten.
Ik zou er zelf voor kiezen om een subdirectory 'user' of 'profile' ofzo aan te maken, waarin je deze AliasMatch zet (in dus) zodat de users 't met http://www.domein.com/user/username op kunnen vragen. Ben je in een keer van 't gezeur af :Y)

Of met MultiViews gaan werken, da's misschien nog handiger.

hth :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
drm, ik zorg er wel voor dat mijn gebruikers alleen een domein kunnen aanmaken zonder leestekens.

De regexp die jij net voorstelde werkt echter niet bij mij. Als ik dan naar: http://www.url.nl/blaaaat ga, een 'map' die niet is opgenomen in de lijst met te skippen mappen, dan geeft ie een 404 terug, en forward dus niet naar redirect.php

eigenlijk dacht ik meer aan zoiets:

code:
1
2
^/([^(images)(template)(fotos)(blafmin)(chatten)(kindertent_nieuw)
(template)(usage)(muziek)  ([a-zA-z\.]+) ]+)


maar dat werkt ook niet :'(

Volgens mij is er gewoon iets heel erg mis. Stel ik doe het volgende:

AliasMatch ^/([^.]+) /opt/content/kindertent.nl/HTML/redirect.php of
AliasMatch ^/([^\.]+) /opt/content/kindertent.nl/HTML/redirect.php


Dit wil zeggen, stuur alle bestanden die geen punt hebben naar redirect.php, de rest niet.

Welke url ik ook aanroep, zelfs: www.url.nl/index.php wordt doorgestuurd naar redirect.php, terwijl er toch echt een . in zit

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik heb ook nog dit geprobeerd:

code:
1
RedirectMatch 303 ^/([^\.]+) http://www.url.nl/redirect.php?name=$1

Dit mocht ook niet baten.

Ik blijf er iig vrij nuchter onder....


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Wat als je 't probeert op te lossen met ErrorDocument?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Met ErrorDocument moet het werken. Er is wel een verschil tussen
code:
1
ErrorDocument 404 http://url.com/redirect.php

en
code:
1
ErrorDocument 404 /redirect.php

namelijk de waarde van HTTP_SERVER_VARS["REQUEST_URI"].

Daarnaast staat er nog info in
HTTP_SERVER_VARS["REDIRECT_ERROR_NOTES"],
["REDIRECT_REQUEST_METHOD"],
["REDIRECT_STATUS"] en
["REDIRECT_UNIQUE_ID"].

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik heb dit geprobeerd, maar hij vindt redirect.php niet als ik dit heb in mijn virtualhost:

code:
1
2
3
DocumentRoot /opt/content/kindertent.nl/HTML

ErrorDocument 404 /redirect.php


Het pad is toch zeker goed:

code:
1
2
3
4
[root@server HTML]# ls /opt/content/kindertent.nl/HTML/redirect.php

-rw-r--r--    1 kinderte kinderte      378 Oct 12 16:42 
/opt/content/kindertent.nl/HTML/redirect.php


Doe ik dan:

www.url.nl/blaaat, dan krijg ik een 404 terug en niet mijn redirect.php

Verander ik mijn virtualhost in:

code:
1
ErrorDocument 404 http://www.url.nl/redirect.php


dan kom ik wel op redirect.php maar dan krijg ik verkeerde info terug:

code:
1
2
3
4
REQUEST_URI=/redirect.php
REDIRECT_ERROR_NOTES=
REDIRECT_STATUS=200
REDIRECT_UNIQUE_I=


Hier vond ik een gebruiker die precies hetzelfde probleem heeft, maar ik zie in de suggesties geen oplossingen:
http://list.cobalt.com/pi...001-September/055856.html
http://www.phpbuilder.com/annotate/message.php3?id=1009618

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ben alweer een klein stapje verder.

Met mozilla werkt het namelijk prima kom ik net achter. Het hele probleem zit em dus in (mijn) IE (6?)

UPDATE:

Als ik in IE bij tools->geavanceerd de volgende optie uitvink:
Gebruikersvriendelijke HTTP-foutberichten weergeven

Dan werkt het opeens wel. Wat is dit voor een onzin, dat zou betekenen dat ik niet elke gebruiker naar zijn subdomein kan sturen als hij deze optie aan heeft staan? Of is mijn IE gewoon buggy?

UPDATE 2:

Het is opgelost. Eindelijk. Het lijkt erop dat redirect.php wel wordt uitgevoerd, onafhankelijk van de instellingen bij de client. Alleen, als je alleen informatie print in redirect.php dan kiest IE er voor om zijn eigen error bestand te printen. Doe je echter een header("location: header.php?foutmelding=$REQUEST_URI"); dan wordt dat prima uitgevoerd!

Hopelijk heeft iemand hier ooit nog iets aan ;)

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Goed, onder het mom van oude topics heropenen met nieuwe problemen. Nogmaals hier mijn post van vandaag:

Een tijd geleden heb ik een redirect opgezet voor mijn server, waarbij alle aanroepen naar mijn domein in de vorm:

http://www.domein.nl/EENMAP_OF_BESTAND

waarbij EENMAP en BESTAND niet bestaande bestanden zijn.

Ik stuur al deze aanvragen door met:
ErrorDocument 404 /redirect.php

In redirect.php vraag ik dan op wat voor bestand het was. Het idee is, dat ik oneindig veel subdomeinen kan genereren zonder mijn httpd.conf aan te hoeven passen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$profiel = substr($HTTP_SERVER_VARS["REQUEST_URI"], 1);

if(!strstr($profiel, ".")){
 include("connect.php");

 $result = $mydb->execute_query("SELECT id, stijl FROM 
gebruikers WHERE gebruikersnaam = '$profiel'");

 if($mydb->fetch_num_rows($result)){
   $row = $mydb->fetch_row_object($result);
   header("location: template.php?id=$row->id&tid=$row->stijl");
   exit();
 }
 else{
     $error_message = "Dit profiel bestaat niet.";
     header("location: error.php?foutmelding=$error_message");
     exit();
 }
}
else{
     $error_message = "Dit bestand bestaat niet.";
     header("location: error.php?foutmelding=$error_message");
     exit();
}



Dus:

http://www.domein.nl/gebruikersnaam

wordt in redirect.php doorgestuurd naar: template.php?id=$gebruikers_id


Werkt allemaal prachtig, maar nu komt het probleem: hoe behoudt ik het domein met de niet bestaande map als url in mijn adresbalk?

Dus: www.domein.nl/gebruikersnaam in de adresbalk, maar ondertussen werken in: www.domein.nl/template.php?id=$gebruikers_id

Ik kom er niet uit, omdat de url uiteindelijk verwijst naar een niet bestaande map. Ik kan in die map dus geen index.html zetten.

Iemand een idee?

BTW, mod_rewrite is hier goed voor, maar zoals je hierboven kan lezen is het niet gelukt om bepaalde (wel bestaande mappen) in de regexp uit te sluiten. Vandaar de ErrorDocument.

Ik blijf er iig vrij nuchter onder....


  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 21:49
je kunt een frameset terugsturen met als src "template.php?id=$gebruikers_id"

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Dit zou inderdaad prima werken, als ik niet met het vervelende probleem van 3 posts hierboven zou zitten. IE laat mij niet informatie printen in het eerstvolgende bestand dat wordt aangeroepen door de ErrorDocument. Dat bestand wordt echter wel uitgevoerd en met een redirect kan ik vervolgens wel een nieuw bestand aanroepen, maar dan ben ik mijn url kwijt.

Zet ik die instelling van IE:
Gebruikersvriendelijke HTTP-foutberichten weergeven
uit, dan werkt het perfect. Maar zonder niet, en het staat standaard aan bij IE gebruikers.

Ik vraag me af of dat is te omzeilen.

Ik blijf er iig vrij nuchter onder....


  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 21:49
sorry, niet goed gelezen..

zoekzoek..
Google cache

Veel verder dan dat kom ik niet. De 404 response code zit er ingebakken.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Het is opgelost.

Dit moet bovenaan in de index.php komen:
header("http/1.0 200 OK");
header("Content-type: text/html");

en dan staat in de httpd.conf:

ErrorDocument 404 /index.php

Dan blijft mooi de url staan.

Ik blijf er iig vrij nuchter onder....


  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 21:49
Hee, je hebt gelijk!
Ik zat hetzelfde te proberen, maar dan onder perl. Daar werkt het niet, in ieder geval niet op deze manier:

print "HTTP/1.1 200 OK\n";
print "Content-type: text/html\n\n";
print "Bericht";

apache meldt dan dat ie niet 2 statussen kan versturen (eerst een 404 en dan 200)

maar met php lukt dit wel. Tnx maartenvdv! _/-\o_

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Verwijderd

FYI

Je redirect klopte niet helemaal voor wat je probeert...

Namelijk met %{REQUEST_URI} krijg je dus altijd '/gebruikersnaam' en dus ook altijd een 404
en daardoor dat elk request, dus ook bestaand resources, richting profile.php ging!

Hier moet echter %{REQUEST_FILENAME} gebruikt worden.. 'gebruikersnaam'

zie me simpel voorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
#
# ReWrite for dynamic profile mapping
# ----------------------------------------------------
# Maps : http://domain/<request>
# To   : http://domain/profile.php?name=<request>
#
# Condition:
#       <request> is a non-existant resource
#
<IfModule mod_rewrite.c>

    # Turn on Engine
    RewriteEngine on

    # Check if REQUEST_FILENAME is an existing file in the DOCUMENT_ROOT
    RewriteCond %{REQUEST_FILENAME} !-f

    # Check if REQUEST_FILENAME is an existing dir in the DOCUMENT_ROOT
    RewriteCond %{REQUEST_FILENAME} !-d

    # ReWrite the URL to profile page 
    # with GET variable 'name' set with the REQUEST_FILENAME value
    RewriteRule ^(.+) http://domain/profile.php?name=$1 [L]

</IfModule>


Dit gaat elk REQUEST_FILENAME die niet bestaat doorforwarden,
code:
1
http://domain/username -> http://domain/profile.php?name=username


Maar ook alles dat niet echt bestaat en ook geen user is!

code:
1
2
3
4
5
6
    http://domain/non-existant-file.php  
    ->  http://domain/profile.php?name=non-existant-file.php
    http://domain/non-existant-dir/  
    ->  http://domain/profile.php?name=non-existant-dir/
    http://domain/non-existant-dir/non-existant-file.php  
    -> http://domain/profile.php?name=non-existant-dir/non-existant-file.php

Je zou dan nog een Condition bij kunnen zetten in de vorm van een regexp die het REQUEST_FILENAME bekijkt op het eerste resource.

Of ipv profile.php, redirect.php gebruiken in bovenstaand Rule.

redirect.php die bv het username checkt tegen je db... if exists forward naar profile.php.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    // redirect.php

    // Get username from GET vars
    $username = $HTTP_GET_VARS["name"];

    // .. check username against database
   
    if (USER_NAME_EXISTS) {
        // if the user exists redirect to the Profile
        header("Location: http://domain/profile.php?name=$username\n\n");
    } else {
        // else redirect to a sign-on page... or something
        header("Location: http://domain/join.php\n\n");
    }
?>



-Aubrey
Pagina: 1