2 votes

Redirection correcte des visiteurs (PHP et Regex)

Je souhaite que mes visiteurs se rendent sur subdomain.example.com qu'ils soient redirigés vers anothersubdomain.example.com . Et s'ils vont à css.subdomain.example.com qu'ils soient redirigés vers css.anothersubdomain.example.com etc.

J'ai essayé les expressions rationnelles suivantes (avec preg_match) :

Tentative 1 :

if(preg_match('#(([\w\.-]+)\.subdomain|subdomain)\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'anothersubdomain.example.com/');
}

S'ils vont à : subdomain.example.com vers lequel ils sont redirigés : anothersubdomain.example.com

Mais s'ils vont à : css.subdomain.example.com ils sont également redirigés vers : subdomain.example.com - Cela ne fonctionne donc pas

Tentative 2 :

if(preg_match('#([\w\.-]+)\.subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'.anothersubdomain.example.com/');
}

S'ils vont à : css.subdomain.example.com vers lequel ils sont redirigés : css.anothersubdomain.example.com

Mais s'ils vont à : subdomain.example.com vers lequel ils sont redirigés : .subdomain.example.com - Et cette URL n'est pas valide, donc cette tentative ne fonctionne pas non plus.

Quelqu'un a une réponse ? Je ne veux pas utiliser les réécritures de nginx ou d'apache.

Merci d'avance.

3voto

nickb Points 37850

Le présent a fonctionné pour moi :

$tests = array(
    'subdomain.example.com' => 'anothersubdomain.example.com',
    'css.subdomain.example.com' => 'css.anothersubdomain.example.com'
);

foreach( $tests as $test => $correct_answer) {
    $result = preg_replace( '#(\w+\.)?subdomain\.example\.com#', '$1anothersubdomain.example.com', $test);
    if( strcmp( $result, $correct_answer) === 0) echo "PASS\n";
}

Ce que j'ai fait, c'est rendre facultatif le groupe de capture pour le "premier" sous-domaine. Ainsi, si vous imprimez les résultats comme suit :

foreach( $tests as $test => $correct_answer) {
        $result = preg_replace( '#(\w+\.)?subdomain\.example\.com#', '$1anothersubdomain.example.com', $test);
    echo 'Input:    ' . $test . "\n" . 
         'Expected: ' . $correct_answer . "\n" . 
         'Actual  : ' .$result . "\n\n";
}

Vous obtiendrez en tant que résultat :

Input:    subdomain.example.com
Expected: anothersubdomain.example.com
Actual  : anothersubdomain.example.com

Input:    css.subdomain.example.com
Expected: css.anothersubdomain.example.com
Actual  : css.anothersubdomain.example.com

Il s'agit maintenant de l'appliquer à vos besoins :

if( preg_match( '#(\w+\.)?subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $matches)) {
    echo header( 'Location: http://'. (isset( $matches[1]) ? $matches[1] : '') .'anothersubdomain.example.com/');
}

0voto

Xophmeister Points 4281
if(preg_match('#(\w*\.?)subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'anothersubdomain.example.com/');
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X