Meerdere talen in PHP met subdomeinen

Status
Niet open voor verdere reacties.
Ben op zich wel tevreden over mijn host. Ik ga kijken wat ik eraan kan doen. In ieder geval bedankt voor de hulp.
 
Code:
## Enable rewrite. Use root as base
RewriteEngine On
RewriteBase /

## 301 redirect to https, except /widget
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI}  !^/widget
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

## 404 page not found
ErrorDocument 404 /fout.php

## Wordpress rewrite
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
 
en.example.nl/... of example.nl/en/...
Beide heb ik vroeger geimpementeerd maar ze zijn minder vriendelijk voor bezoekers.
Engelstalige bezoekers typen example.nl of www.example.nl en moeten bij een bezoek altijd de eerste pagina opvragen via de NL website naar de EN website. Veel bezoekers haken dan al af. Het is vriendelijker om te kijken naar de taal van de browser-GUI en de cookie van de taalkeuze van het vorige bezoek.
 
een poging het nog iets simpel te houden.
  1. Goed ik heb veel gehoord en gezien maar je kan het zo ook bekijken .
    Je moet éérst en vooral je dns records laten doorverwijzen in router of *.domein.extentie nemen.
    ook de file vhosts grondig bekijken te vinden onder conf in vele gevallen
  2. dan kom je .htaccess file
    Code:
    AddDefaultCharset utf-8
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([A-Za-z0-9\.]+)/([A-Za-z0-9\.]+)/([A-Za-z0-9]+)/([A-Za-z0-9]+)!(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ ./?loc=$1&action=$2
    RewriteRule ^([A-Za-z0-9\.]+)![COLOR="#FF0000"](\.css|\.js|\.png|\.jpg|\.gif|robots\.txt[/COLOR])$ ./$1/
    RewriteRule ^([COLOR="#FF0000"][A-Za-z0-9\.[/COLOR]]+)/$ ./?loc=$1
    RewriteRule ^([A-Za-z0-9\.]+)/([A-Za-z0-9\.]+)!(\.css|\.js|\.png|\.jpg|\.gif|\.svg|robots\.txt)$ ./$1/$2/
    RewriteRule ^([A-Za-z0-9\.]+)/([A-Za-z0-9]+)$ ./$1/$2/$3
    [A-Za-z0-9\.] dit dient als beveiliging en laat weinig toe van injecties en maakt dat je minder moet controleren.
    !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ je moet sommige extenties uitsluiten en dus niet laten uitvoeren
    ./ is een verdoken verwijzing naar index.php of html extra
  3. nu kom je in php aan kan er zo uit zien en beschermd onrechtsreeks het afhandelscript
    Code:
    <?php
    include('./afhandelscript.php');
    [COLOR="#FF0000"]$locale = getlang($_SERVER['HTTP_HOST']);[/COLOR]
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE ^ E_WARNING);
    function getlang($HTTP_HOST){
        if(preg_match('[COLOR="#FF0000"]^([A-Za-z]+){2,3}\.[/COLOR](([A-Za-z0-9]+)\.)+([A-Za-z]+){2,10}$^',$HTTP_HOST)){
            return substr($HTTP_HOST,0,strpos($HTTP_HOST,'.'));
        }else{
            return [COLOR="#FF0000"]'en'[/COLOR];
        }
    }
    new Init([COLOR="#FF0000"]$locale[/COLOR]);
    ?>
  4. nu afhandelscript
    Code:
    $_DEBUG = true;
    $_FOLLOW = false;
    spl_autoload_extensions('.php,.inc');
    spl_autoload_register(...
    );
    
    class Init{
        private $version = '4.0' ;
        private $overwritesearch = false;
        private $iplockdir = './???/iplocks/';
        private $cashdir = './???/fullcash/';
        [COLOR="#FF0000"]private $locale='en';[/COLOR]
        function __construct(){
            if($this->isLOCK()){
                include('./errors/outofservice.html');
                die();
            }
             $argv = func_get_args();
             try{
                 switch(func_num_args()){
                     case 0   $this->loc='page';// te weinig parameters opvang constructie
                                 $this->action='home';
                                 self::__constructNormal();break;
                     case 1:     [COLOR="#FF0000"]$this->locale = $argv[0];[/COLOR]// hier zal de constructor al de taal zetten en mee geven aan de controler
                                 self::__constructNormal();break;
                     case ???     
                     if($argv[2]=='Crons'){
                        self::__constructCrons(???);
                     }
                     
                 }
             }catch(Object $e){
                print_r($e);
             }
             die();
        }...
 
Laatst bewerkt:
Zo te zien is het probleem van topicstarter Pilootnour5 nog niet opgelost. Alle subdomeinen komen op een '404 Not found' uit, en de hoofddomein gewoon op de website. Ik vermoed dat subdomeinen automatisch naar een map gaan die je moet aanmaken.

Het lijkt dus dat de hosting de vhost moet aanpassen, als ze dat willen of kunnen. Heeft de topicstarter nog wat vernomen van hen?
 
Laatst bewerkt:
(blokje 2) .htaccess
De laatste 5 regels in .htaccess zou ik tijdens bouwen weglaten omdat onder andere de toegestanee - en _ in de condities missen. Ook de rewrite voor WP zal erbij gezet moeten worden.

(blokje 3) php
In de functie getLang() vraag je de domein extensie van de webserver op. Dit is niet de taal van de bezoeker van de website. Je kan dit hier oplossen met
Code:
function getLang(arrServer) {
  if (isset(arrServer['HTTP_ACCEPT_LANGUAGE'])) {
    return substr(arrServer['HTTP_ACCEPT_LANGUAGE'],0,2);
  }
  return 'nl';
}
$lang = getLang($_SERVER);

(blokje 4) php
Zulke code komt van de php.net website. Ik kan het zo gauw niet terugvinden.
Hoe TS dit zou kunnen gebruiken en/of inpassen in zijn code weet ik niet.
 
Ik hoop dat u zich niet aangevallen voelt maar dit zijn mijn gedachtegangen.
(blokje 2) .htaccess
De laatste 5 regels in .htaccess zou ik tijdens bouwen weglaten omdat onder andere de toegestanee - en _ in de condities missen. Ook de rewrite voor WP zal erbij gezet moeten worden.
Programmeurs zoals ik houden geen rekening met andere cms'en daar die dat zelf moeten ondervangen als dat al van toepassing is.
(blokje 3) php
In de functie getLang() vraag je de domein extensie van de webserver op. Dit is niet de taal van de bezoeker van de website. Je kan dit hier oplossen met
Code:
function getLang(arrServer) {
  if (isset(arrServer['HTTP_ACCEPT_LANGUAGE'])) {
    return substr(arrServer['HTTP_ACCEPT_LANGUAGE'],0,2);
  }
  return 'nl';
}
$lang = getLang($_SERVER);
we spreken van talen als subdomein dus dan heb je de domeinen ...
domein.extentie
nl.domein.extentie
be_nl.domein.extentie (deze is niet ondersteund in het script om het simpel te houden)
en.domein.extentie
dus wat de taal ook is je kan zelf kiezen als je op een bepaald subdomein zit.(het is niet omdat de computer in een taal staat dat de gebruiker dit dan ook op de site wenst)
de functie zorgt dat dat probleem afgezondert is dus wat zijn regels zijn om de lang te pakken te krijgen moet hij maar zelf bepalen in mijn ogen.
(blokje 4) php
Zulke code komt van de php.net website. Ik kan het zo gauw niet terugvinden.
Hoe TS dit zou kunnen gebruiken en/of inpassen in zijn code weet ik niet.
Dan is die van mijn code overgenomen want dit is mijn code.
Is de laaste block niet de volledige code nee maar ik moet mijn eigen veiligheid ook beschermen dus wordt ook niet alle code geplaatst.
ik wil bemerken dat het van een werkend geheel komt en die heeft site heeft een extra moeilijkheid.

lang.subdomein.domein.be/path/?param

Het werkt nu al meer of 3 a 4 jaar zonder problemen te merken dus ga ik ervanuit dat het redelijk ok is.
 
Laatst bewerkt:
Het stukje tekst over de WP code in .htaccess was slechts een aanvulling op jouw verhaal. Waar het om ging is dat het m.i. minder handig is om tijdens het ontwikkelen al security rules in .htaccess te zetten, dat kan lastig zijn bij het debuggen.

Vraagje: verandert de inhoud van $_SERVER['HTTP_HOST'] van www.example.nl naar en.example.nl op subdomein 'en' ?
Als dit het geval is dan zou het eenvoudiger kunnen omdat het 3 mogeliijkheden zijn: www.example.nl / example.nl / en.example.nl
Code:
function getlang($HTTP_HOST) {
  return ((substr($HTTP_HOST,0,3) === 'en.') ? 'en' : 'nl');
}

het is niet omdat de computer in een taal staat dat de gebruiker dit dan ook op de site wenst
De opzet van TS was om "het bereik te vergroten" en met de EN website ook bezoekers die niet Nederlands beheersen van dienst te zijn. Deze doelgroep heeft logisch meestal een Windows en een browser in hun eigen taal. Het is handig dat als deze bezoeker op de website komt, hij als eerste op de voorkeurtaal komt en daarna de keuze heeft om een andere taal te kiezen. Bij deze website is dit eenvoudig: elke taal (behalve NL) gaat naar de EN website. Vandaar mijn oplossing.

In berichtje 18 heb ik om deze reden de Cookie oplossing gegeven omdat je daarmee de taalvoorkeur direct al weet en de taalkeuze van de bezoeker kan onthouden zonder gebruik te hoeven maken van subdomeinen (wat ik persoonlijk vriendelijker vind voor bezoekers). In deze oplossing gaan nl_NL en nl_BE naar de NL website.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan