Bonjour,
j'ai réalisé un site avec une architecture MVC, j'ai incorporé le tuto sur le routing de grafikart, en local tout fonctionne normalement.
Le problème est que lorsque je mets le site sur un serveur (hebergement 1&1), j'ai un probleme avec mon htaccess !
Si je l'utilise dans l'état (selon le tuto), j'ai une belle erreur 500. J'ai vue sur un autre forum que 1&1 oblige a rajouter RewriteBase /, j'ai pas trop compri comment ça fonctionne, je sais que c'est pour les chemins relatif pour les fichier mais là je nage un peut.
Mon domaine pointe vers le dossier site, qui contient les dossier (app, core, web). Le démarrage de l'application est index.php qui se trouve dans le dossier web.
le fichier htaccess est à la racine du site
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteBase /
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
L'idée étant que tes dossiers core/ et app/ ne soient pas accessible, donc idéalement, il devrait être au niveau inférieur ou égal au dossier site/ mais pas dans le dossier site/ (private)
Ton dossier "web/" (public) devrait idéalement être accessible directement (donc à la racine).
RewriteBase, c'est en gros l'équivalent de "base href" en HTML. Il affecte toutes les premières parties de ton "RewriteRule" mais pas la seconde partie si mes souvenirs sont bons.
Donc, à essayer, ça devrait donner :
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ web/index.php?url=$1 [QSA,L]
Oui, et du coup, tu peux retirer web/ de " web/index.php?url=$1 [QSA,L]"
Et donc si tu peux le faire pointer sur "web/" ça serait préférable, et noramelement, tout devrait fonctionner.
du coup si je fais pointer mon domaine sur web, le .htaccess, je le mets dans le dossier web non?
en fait ça fonctionne presque, en local j'ai une url du type monsite/article, et ça fonctionne maintenant, j'ai monsite/index.phparticle !!!
Alors du coup est ce que ça vient toujours du htaccess ?
bon j'avance ! dans mon système de routing, je teste si les fichiers existe. Seulement j'ai un gros problème de compréhension, je mélange un peut tout. En local, je m'en sort mais sur un serveur j'arrive pas a m'y mettre. Je pense qu'il est préférable de tester avec le chemin absolu non?
define('ROOT', dirname(__DIR__));
if(is_string($this->callable)){
$page = explode('#', $this->callable);
if($page[0] === 'admin'){
$controller = '\\App\\Controller\\Admin\\'.ucfirst($page[1]).'Controller';
$action = $page[2];
}else{
$controller = '\\App\\Controller\\'.ucfirst($page[0]).'Controller';
$action = $page[1];
}
$controle = str_replace('App', 'app', $controller).'.php';
var_dump(ROOT.$controle);
var_dump(file_exists(ROOT.$controle));die;
if(!file_exists(ROOT.$controle)){
header('Location: '.WEBROOT.'notfound');
}
$controller = new $controller();
return call_user_func_array([$controller, $action], $this->matches);
}else{
return call_user_func_array($this->callable, $this->matches);
}