Bonjour,

J'ai refondu en très grande partie mon site internet. Tout fonctionne parfaitement en local sur Wamp, mais là, j'ai une erreur 500. Vu qu'il fonctionnait, je sais que c'est pas les modules ou quoi que ce soit coté apache, c'est forcement mes codes.

Ma première version du site ( fabriqué grâce au cours pour faire un site de A à Z) était hébergé sur hebergratuit.net. J'ai supprimé les fichiers pour installer les fichiers modifié à la place. Meme Myadmin y est passé.
Je me souviens d'avoir eu des problèmes sur le même principe (dernière conversation )qui ont étés résolus:
"Impossible de traiter cette demande via www.monsite.hebergratuit.net à l'heure actuelle.
HTTP ERROR 500"

J'ai donc recommencé tout le procès sur la résolution:
j'ai vérifier/modifié les droits d'accès des fichiers en 755 (sauf les htaccess de redirection qui sont resté en 644);
et J'ai inclu dans mon layout/default.php :

    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

pour voir les erreurs. ensuite j'ai modifié mes deux htaccess avec

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>

et

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /webroot/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L]
</IfModule 

pour voir si c'est pas ça, puis J'ai supprimé mon htaccess de la racine pour voir si je peux voir les pages. Je peux aller sur mon layout (il ne s'affichent pas mais il n'y a pas d'erreur de noté)

j'ai vérifié les ortographes.. là, je sêche.

Auriez-vous une piste ? merci

13 réponses


Carouge10
Réponse acceptée

Bonsoir,
Sur mon site en ligne, dans la fonction "url" de ton router j'ai retiré le BASE_URL du return.
Deplus tu dis que ta fonction "parse" retourne un tableau alors que c'est un boolean.
Ensuite l'initialisation de l'affichage des erreurs doit se faire sur le 1er fichier appelé donc index.php

Après pour débugger sans avoir accès au fichier log de ton serveur, je mets un die('toto'); en avançant ligne par ligne.
Exemple; j'en mets un avant la 1ère ligne de index.php et je vérifie qu'il s'affiche, si oui alors je le mets après la seconde instructions et ains de suite

JoHuv
Auteur

Bonjour,
Il y a un truc que je ne comprends pas.
Quand sur mon site hébergé ceci est est noté de cette façon

require_once CORE.DS.'func.php';

ça ne fonctionne pas:

Remarque : Utilisation de la constante non définie CORE - supposée 'CORE' dans      /home/vol11_4/hebergratuit.net/heber_*/htdocs/view/layout/default.php à la ligne 6

Remarque : Utilisation de la constante DS non définie - DS supposée dans /home/vol11_4/hebergratuit.net/heber_*/htdocs/view/layout/default.php à la ligne 6

Avertissement : require_once (COREDSfunc.php): échec de l'ouverture du flux: aucun fichier ou répertoire de ce type dans /home/vol11_4/hebergratuit.net/heber_*/htdocs/view/layout/default.php à la ligne 6

Erreur fatale : require_once (): ouverture impossible: 'COREDSfunc.php' (include_path = '.: / Usr / share / pear /') dans /home/vol11_4/hebergratuit.net/heber_*/htdocs/view/layout/default. php sur la ligne 6

alors que ça fonctionne très bien en local grace à ma page index.php

<?php

define('WEBROOT',dirname(__FILE__)); 
define('ROOT',dirname(WEBROOT)); 
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core'); 
define('BASE_URL',dirname(dirname($_SERVER['SCRIPT_NAME']))); 

require CORE.DS.'includes.php'; 
new Dispatcher(); 

Pourquoi ???

JoHuv
Auteur

Bon, je suppose qu'en allant sur la page default, ça ne prends donc pas en compte mon index.php sur lequel mon Htaccess doit rediriger. Du coup, le site ne marche pas avec le HTACCESS et sans. c'est le chien qui se mort la queue. Personne n'aurait le moyen de m'éguiller ?

Bonjour,
As-tu vérifié que les droits étaient bien sur www-data ? De plus est-ce que la version de PHP est la même ?

JoHuv
Auteur

Bonjour,
Les droits sont vérifiés et re-vérifiés. Mais, en effet, la version PHP n'est pas la même. Est-ce que ça suffirait d'avoir une erreur 500 complètement ? je pensais devoir régler que des erreurs standards, mais pas un bug total. Je vois pour remettre une autre version de wamp, et reviendrais pour dire ce qui en est.

JoHuv
Auteur

Bonjour Arcoss,
Après avoir supprimé, puis installé la dernière version, c'est à dire wamp3, avec la dernière version de php (la même que l'hébergeur), j'ai repris ma version qui fonctionne parfaitement avec php7, et j'ai modifier mes adresses "http://locahost:8080/monsite/" avec "http://www.monsite.hébegementgratuit.net/ et les codes d'accès au SQL.
J'ai utilisé Filezilla pour déposer cette nouvelle version hébergé.
Les deux HTACCESS affichés plus haut me font une erreur 500. J'ai remis l'ancienne version qui est

RewriteEngine On
RewriteRule (.) webroot/$1 [L]

et

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (. ) index.php/$1 [L]

maintenant j'accède à mon layout, puis mon index.php. Seulement, mes autres pages ne fonctionnent pas, ainsi que mon style.css... Je ne peux même pas me déconnecter, puisque mes autres pages ne fonctionnent pas: logout.php est une page ^^

JoHuv
Auteur

Bon, du new...
Les pages ne fonctionnent pas, pourquoi ?
Mes liens sont fait de la manière suivante:

href="<?php echo Router::url('pages/video'); ?>">

Quand je clic dessus, il m'affiche cette page :

http://pages/video

Donc forcement ! Mais quand je modifie l'adresse manuellement

http://www.****.hebergratuit.net/pages/video

la page fonctionne. Forcement, la css ne va pas, mais ça fonctionne.

Que pourrais-je modifier pour que cette forme <?php echo Router::url('pages/video'); ?> fonctionne sur l'hébergeur alors que ça fonctionne en local ????

Bonjour.
Sans voir ce que fait ta classe Router, ça va être dur de t'aider.

JoHuv
Auteur

Pardon.

<?php
class Router{

static $routes = array(); 
static $prefixes = array(); 

/**
* Ajoute un prefix au Routing
**/
static function prefix($url,$prefix){
    self::$prefixes[$url] = $prefix; 
}

/**
* Permet de parser une url
* @param $url Url à parser
* @return tableau contenant les paramètres
**/
static function parse($url,$request){
    $url = trim($url,'/'); 
    if(empty($url)){
        $url = Router::$routes[0]['url']; 
    }else{
        $match = false; 
        foreach(Router::$routes as $v){
            if(!$match && preg_match($v['redirreg'],$url,$match)){
                $url = $v['origin'];
                foreach($match as $k=>$v){
                    $url = str_replace(':'.$k.':',$v,$url); 
                } 
                $match = true; 
            }
        }
    }

    $params = explode('/',$url);
    if(in_array($params[0],array_keys(self::$prefixes))){
        $request->prefix = self::$prefixes[$params[0]];
        array_shift($params); 
    }
    $request->controller = $params[0];
    $request->action = isset($params[1]) ? $params[1] : 'index';
    foreach(self::$prefixes as $k=>$v){
        if(strpos($request->action,$v.'_') === 0){
            $request->prefix = $v;
            $request->action = str_replace($v.'_','',$request->action);  
        }
    }
    $request->params = array_slice($params,2);
    return true; 
}

/**
* Permet de connecter une url à une action particulière
**/
static function connect($redir,$url){
    $r = array();
    $r['params'] = array();
    $r['url'] = $url;  

    $r['originreg'] = preg_replace('/([a-z0-9]+):([^\/]+)/','${1}:(?P<${1}>${2})',$url);
    $r['originreg'] = str_replace('/*','(?P<args>/?.*)',$r['originreg']);
    $r['originreg'] = '/^'.str_replace('/','\/',$r['originreg']).'$/'; 
    // MODIF
    $r['origin'] = preg_replace('/([a-z0-9]+):([^\/]+)/',':${1}:',$url);
    $r['origin'] = str_replace('/*',':args:',$r['origin']); 

    $params = explode('/',$url);
    foreach($params as $k=>$v){
        if(strpos($v,':')){
            $p = explode(':',$v);
            $r['params'][$p[0]] = $p[1]; 
        }
    } 

    $r['redirreg'] = $redir;
    $r['redirreg'] = str_replace('/*','(?P<args>/?.*)',$r['redirreg']);
    foreach($r['params'] as $k=>$v){
        $r['redirreg'] = str_replace(":$k","(?P<$k>$v)",$r['redirreg']);
    }
    $r['redirreg'] = '/^'.str_replace('/','\/',$r['redirreg']).'$/';

    $r['redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
    $r['redir'] = str_replace('/*',':args:',$r['redir']); 

    self::$routes[] = $r; 
}

/**
* Permet de générer une url à partir d'une url originale
* controller/action(/:param/:param/:param...)
**/
static function url($url = ''){
    trim($url,'/'); 
    foreach(self::$routes as $v){
        if(preg_match($v['originreg'],$url,$match)){
            $url = $v['redir']; 
            foreach($match as $k=>$w){
                $url = str_replace(":$k:",$w,$url); 
            }
        }
    }
    foreach(self::$prefixes as $k=>$v){
        if(strpos($url,$v) === 0){
            $url = str_replace($v,$k,$url); 
        }
    }
    return BASE_URL.'/'.$url; 
}

static function webroot($url){
    trim($url,'/');
    return BASE_URL.'/'.$url; 
}

}

Comme tu peux le voir, c'est suite aux cours de "création d'un site de A à Z".

Tu as déjà un problème à la première ligne de la méthode url, tu utilises la fonction trim sur $url, mais tu ne stockes pas le retour de la fonction (c'est également le cas dans la méthode webroot), par conséquence trim ne sert à rien dans ce cas là.

JoHuv
Auteur

J'ai modifié comme ceci:

/**
* Permet de générer une url à partir d'une url originale
* controller/action(/:param/:param/:param...)
**/
static function url($url = ''){
    $url = trim($url,'/'); 
    foreach(self::$routes as $v){
        if(preg_match($v['originreg'],$url,$match)){
            $url = $v['redir']; 
            foreach($match as $k=>$w){
                $url = str_replace(":$k:",$w,$url); 
            }
        }
    }
    foreach(self::$prefixes as $k=>$v){
        if(strpos($url,$v) === 0){
            $url = str_replace($v,$k,$url); 
        }
    }
    return BASE_URL.'/'.$url; 
}

static function webroot($url){
    $url = trim($url,'/');
    return BASE_URL.'/'.$url; 
}

mais pas de changement.

JoHuv
Auteur

je me suis "amusé" à changer quasiment toutes les adresse <?php echo Router::url('pages/video'); ?> et <?php echo Router::webroot('css/style.css'); ?> . FOrcement, ça fonctionne. Mais ceci ne me convient pas. Surtout quand j'ai des "<?php echo Router::url('admin/posts/edit/'.$v->id); ?>"
J'ai beau passer tout en revu, je ne trouves rien...

htaccess

RewriteEngine On
RewriteRule (.*) webroot/$1 [L]

dirige vers

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/$1 [L] 

index.php

<?php
define('WEBROOT',dirname(__FILE__)); 
define('ROOT',dirname(WEBROOT)); 
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core'); 
define('BASE_URL',dirname(dirname($_SERVER['SCRIPT_NAME']))); 

require CORE.DS.'includes.php'; 
new Dispatcher(); 

Includes.php

<?php
require 'Session.php';
require 'Form.php';
require 'functions.php';
require 'Router.php';
require ROOT.DS.'Config'.DS.'conf.php';
require 'Request.php';
require 'Controller.php';
require 'Model.php';
require 'Dispatcher.php';

le Router, vous l'avez plus haut

JoHuv
Auteur

C'est un truc de fou : J'ai retiré BASE_URL -> erreur 500 direct. Je remet -> je peux voir certaines de mes pages...

Edit:
J'ai fait mon boulet encore :p , J'ai retiré BASE_URL . " ( j'avais laissé le point, d'où l'erreur illico ! ) Et ça fonctionne...

/**
* Permet de générer une url à partir d'une url originale
* controller/action(/:param/:param/:param...)
**/
static function url($url = ''){
    $url = trim($url,'/'); 
    foreach(self::$routes as $v){
        if(preg_match($v['originreg'],$url,$match)){
            $url = $v['redir']; 
            foreach($match as $k=>$w){
                $url = str_replace(":$k:",$w,$url); 
            }
        }
    }
    foreach(self::$prefixes as $k=>$v){
        if(strpos($url,$v) === 0){
            $url = str_replace($v,$k,$url); 
        }
    }
    return '/'.$url; 
}

static function webroot($url){
    $url = trim($url,'/');
    return '/'.$url; 
}

Merci à vous deux (encore une fois) ! vous êtes mes sauveurs !