From 919427bd2e687c0f5ffe6d83c9fe357e23e0ae1d Mon Sep 17 00:00:00 2001 From: corentinbettiol <corentin@244466666.xyz> Date: Wed, 6 Feb 2019 11:00:45 +0100 Subject: [PATCH] change project/blog organization --- index.php | 4 + site/controller/mainController.php | 60 ++++++++----- site/layout/layout.php | 55 ++++++------ site/model/AdminManager.php | 131 ++++------------------------- site/model/Base.php | 1 + site/model/BlogManager.php | 113 ++++++++++++++++++++----- site/model/ProjectsManager.php | 93 +++++++++++++++----- site/model/config.php | 17 ++++ site/view/public/changelog.php | 11 ++- urlrewriting.txt | 31 ++++++- 10 files changed, 310 insertions(+), 206 deletions(-) create mode 100644 site/model/config.php diff --git a/index.php b/index.php index ef77b33..ff697ef 100644 --- a/index.php +++ b/index.php @@ -1,8 +1,12 @@ <?php +// session pour quand on est admin session_start(); +// le gros gros controlleur (peut-être le casser en plusieurs morceaux plus tard) require_once("site/controller/mainController.php"); + +// afficher le contenu (qui va switcher sur le contenu dynamique à afficher) require_once("site/layout/layout.php"); ?> \ No newline at end of file diff --git a/site/controller/mainController.php b/site/controller/mainController.php index 27df968..5b7920c 100644 --- a/site/controller/mainController.php +++ b/site/controller/mainController.php @@ -1,54 +1,68 @@ <?php +// fichier de config pour la bdd & le compte pour la partie administrateur require_once("site/model/config.php"); + +// connexion à la base de données require_once("site/model/Base.php"); + +// classe pour l'administration du contenu du site require_once("site/model/AdminManager.php"); + +// classe pour la gesion des billets de blog require_once("site/model/BlogManager.php"); + +// classe pour la gestion des projets require_once("site/model/ProjectsManager.php"); +// récupérer le nom de la page en fonction de l'url +// premier texte = affiché dans l'onglet (title), second texte = voir le switch dans site/layout/layout.php function getPageName(){ + // si on a une url personnalisée if(isset($_GET['action'])){ switch ($_GET['action']) { - case 'contact': + case 'contact': // contact return ["Contact", "contact"]; break; - case 'about': + case 'about': // à propos return ["À Propos", "about"]; break; - case 'projects': + case 'projects': // projets return ["Projets", "projects"]; break; - case 'project': + case 'project': // projet return ["Projet", "project"]; break; - case 'changelog': + case 'changelog': // historique des versions return ["Changelog", "changelog"]; break; - case 'eplucher': + case 'eplucher': // déconnexion (la première valeur n'est jamais utilisée) return ["COUCOU AHAH", "eplucher"]; break; - case 'rss': + case 'rss': // rss return ["Rss", "rss"]; break; - case '404': + case '404': // page not found return ["Erreur 404 - File not found", "404"]; break; - case 'article': + case 'article': // billet de blog return [$_GET['title'], $_GET['title']]; break; - case 'patate': + case 'patate': // administration return ["Administration", "administration"]; break; - default: + default: // si l'argument n'est pas compris on affiche le blog return ["Blog", "blog"]; break; } } + // si on est sur l'accueil du site else{ return ["Blog", "blog"]; } } +// affiche le menu du site (avec le titre de la page) function writeMenu($pageName){ ?> <ul id="listMenu"> @@ -60,40 +74,46 @@ function writeMenu($pageName){ </ul> <?php } +// affiche la page du blog function writeBlogPage($pageName){ + // si on n'accède pas au fichier mais bien au site (var définie) if($pageName[1] == "blog"){ - $blog = new BlogManager(); + $blog = new BlogManager(NULL, NULL, NULL, NULL, NULL, NULL); // on a un blogmanager + // si on affiche un post en particulier if(isset($_GET['title'])){ $title = urldecode($_GET['title']); - $blogpost = $blog->getBlogPost($title); + $blogpost = $blog->get($title); if($blogpost != false) require("site/view/public/blogPostView.php"); else header("Location:/404"); } + // si on affiche la liste des posts else{ - $blogposts = $blog->getBlog(0); + $blogposts = $blog->getPage(0); require("site/view/public/blogView.php"); } } } +// affiche la liste des projets function writeProjectsPage($pageName){ - $projects = new ProjectManager(); + $projects = new ProjectManager(NULL, NULL, NULL, NULL, NULL); $projects = $projects->getProjects(); require("site/view/public/projectsView.php"); } +// affiche un projet en particulier function writeProjectPage($pageName){ - $project = new ProjectManager(); + $project = new ProjectManager(NULL, NULL, NULL, NULL, NULL); if(isset($_GET['title'])){ $title = urldecode($_GET['title']); - $project = $project->getProject($title); + $project = $project->get($title); if($project != false){ $project['pageProject'] = true; require("site/view/public/projectView.php"); @@ -106,6 +126,7 @@ function writeProjectPage($pageName){ require("site/view/public/projectsView.php"); } +// tente de connecter l'administrateur function loginAdminPage($pageName){ if(password_verify($_POST['pass'], pass) && $_POST['user'] == user){ $_SESSION['user'] = $_POST['user']; @@ -116,7 +137,7 @@ function loginAdminPage($pageName){ header("Location:/patate"); } - +// afficher le panneau d'administration & gère l'administration du site function writeAdminPage($pageName){ $admin = new AdminManager(); if($admin->verifyAdminConnect()){ @@ -184,10 +205,11 @@ function writeAdminPage($pageName){ require("site/view/private/loginFormView.php"); } +// déconnexion de la partie administration function decoAdminPage(){ $_SESSION = array(); header("Location:/"); } - +// on récupère le nom de la page ici (avant d'inclure le layout) $pageName = getPageName(); \ No newline at end of file diff --git a/site/layout/layout.php b/site/layout/layout.php index 1eabd67..bbbfefc 100644 --- a/site/layout/layout.php +++ b/site/layout/layout.php @@ -4,10 +4,10 @@ <meta charset="utf-8" /> <meta name="description" content="Site perso de Corentin Bettiol." /> <meta name="viewport" content="width=device-width" /> - <title>l3m website - <?php echo $pageName[0]; ?></title> + <title>l3m website - <?php echo $pageName[0]; // voir getPageName() dans mainController ?></title> <link rel="stylesheet" href="/css/design.css" /> <?php - if($pageName[1] == 404){ ?> + if($pageName[1] == 404){ // le css pour la page 404 ?> <link rel="stylesheet" href="/css/404.css" /> <?php } ?> <link rel="icon" type="image/png" href="img/icon.png" /> @@ -29,49 +29,50 @@ --><h1 id="title">l3m website</h1> </header> <nav id="menu"> - <?php writeMenu($pageName[0]); ?> + <?php writeMenu($pageName[0]); // voir mainController ?> </nav> </header> - <?php switch ($pageName[1]) { - case 'blog': - writeBlogPage($pageName); + <?php + // le gros switch qui fait peur + switch ($pageName[1]){ + case 'blog': // blog + writeBlogPage($pageName); // voir mainController break; - case 'about': - require("site/view/public/about.php"); + case 'about': // à propos + require("site/view/public/about.php"); // statique break; - case 'projects': - writeProjectsPage($pageName); + case 'projects': // projets + writeProjectsPage($pageName); // voir mainController break; - case 'project': - writeProjectPage($pageName); + case 'project': // projet en particulier + writeProjectPage($pageName); // voir mainController break; - case 'eplucher': - decoAdminPage(); - case 'contact': - require("site/view/public/contact.php"); + case 'eplucher': // déconnexion du panneau d'administration + decoAdminPage(); // voir mainController + case 'contact': // contact + require("site/view/public/contact.php"); // statique break; - case 'changelog': - require("site/view/public/changelog.php"); + case 'changelog': // historique de développement + require("site/view/public/changelog.php"); // statique break; - case 'rss': - require("site/view/public/rss.php"); + case 'rss': // rss + require("site/view/public/rss.php"); // todo break; - case '404': - require("site/view/public/404.php"); + case '404': // page not found + require("site/view/public/404.php"); // statique break; - case 'administration': + case 'administration': // panneau d'administration (url = patate) + // si on envoie les données en post if(isset($_POST['user']) && isset($_POST['pass'])){ loginAdminPage($pageName); } + // afficher le login screen else{ writeAdminPage($pageName); } break; - case 'eplucher': - decoAdminPage(); - break; - default: + default: // page non connue (n'est pas senser arriver) header('Location:/404'); break; } ?> diff --git a/site/model/AdminManager.php b/site/model/AdminManager.php index 7cc7992..1f15fdc 100644 --- a/site/model/AdminManager.php +++ b/site/model/AdminManager.php @@ -17,14 +17,14 @@ class AdminManager extends Base public function getBlogPost($link) { - $blogpost = new BlogManager(); - return $blogpost->getBlogPost($link); + $blogpost = new BlogManager(NULL, NULL, NULL, NULL, NULL, NULL); // moche :c + return $blogpost->get($link); } public function getProject($link) { - $project = new ProjectManager(); - return $project->getProject($link); + $project = new ProjectManager(NULL,NULL,NULL,NULL,NULL); // moche :c + return $project->get($link); } @@ -33,133 +33,34 @@ class AdminManager extends Base } public function updateBlogPost(){ - $time = htmlspecialchars($_POST['time']); - $title = htmlspecialchars($_POST['title']); - $content = htmlspecialchars($_POST['content']); - $shortContent = htmlspecialchars($_POST['shortContent']); - $comments = 0; - if($_POST['comments'] == "on") - $comments = 1; - $id = htmlspecialchars($_POST['id']); - - - $db = $this->dbConnect(); - $req = $db->prepare('UPDATE l3m_blog SET time = :time, title = :title, content = :content, shortContent = :shortContent, comments = :comments WHERE id = :id'); - $req->execute(array( - 'time' => $time, - 'title' => $title, - 'content' => $content, - 'shortContent' => $shortContent, - 'comments' => $comments, - 'id' => $id - )); + $blog = new BlogManager($_POST['time'], $_POST['title'], $_POST['content'], $_POST['shortContent'], $_POST['comments'], $_POST['id']); + $blog->update(); } public function updateProject(){ - $name = htmlspecialchars($_POST['name']); - $link = htmlspecialchars($_POST['link']); - $content = htmlspecialchars($_POST['content']); - $shortContent = htmlspecialchars($_POST['shortContent']); - $id = htmlspecialchars($_POST['id']); - - $db = $this->dbConnect(); - $req = $db->prepare('UPDATE l3m_projects SET name = :name, link = :link, content = :content, shortContent = :shortContent WHERE id = :id'); - $req->execute(array( - 'name' => $name, - 'link' => $link, - 'content' => $content, - 'shortContent' => $shortContent, - 'id' => $id - )); + $project = new ProjectManager($_POST['name'], $_POST['link'], $_POST['content'], $_POST['shortContent'], $_POST['id']); + $project->update(); } public function sendBlogPost(){ - - $time = htmlspecialchars($_POST['time']); - - if($time == ""){ - $time = new datetime(); - $time = $time->format('Y-m-d H:i:s'); - } - - $title = htmlspecialchars($_POST['title']); - - if(strlen($title) < 1){ - header("Location:/patate"); - exit(); - } - - $content = htmlspecialchars($_POST['content']); - - $shortContent = htmlspecialchars($_POST['shortContent']); - if(strlen($shortContent) < 1){ - $shortContent = "Ce billet de blog ne dispose d'aucune description."; - } - - $comments = 0; - if($_POST['comments'] == "on") - $comments = 1; - - - $db = $this->dbConnect(); - $req = $db->prepare('INSERT INTO l3m_blog(time, title, content, shortcontent, comments) VALUES(:time, :title, :content, :shortContent, :comments)'); - $req->execute(array( - 'time' => $time, - 'title' => $title, - 'content' => $content, - 'shortContent' => $shortContent, - 'comments' => $comments - )); + $blog = new BlogManager($_POST['time'], $_POST['title'], $_POST['content'], $_POST['shortContent'], $_POST['comments'], $_POST['id']); + $blog->send(); } public function sendProject(){ - - $name = htmlspecialchars($_POST['name']); - if(strlen($name) < 1){ - header("Location:/patate"); - exit(); - } - - $link = htmlspecialchars($_POST['link']); - - $content = htmlspecialchars($_POST['content']); - - $shortContent = htmlspecialchars($_POST['shortContent']); - if(strlen($shortContent) < 1){ - $shortContent = "Pas de description."; - } - - $id = htmlspecialchars($_POST['id']); - - $db = $this->dbConnect(); - $req = $db->prepare('INSERT INTO l3m_projects(name, link, content, shortcontent) VALUES(:name, :link, :content, :shortContent)'); - $req->execute(array( - 'name' => $name, - 'link' => $link, - 'content' => $content, - 'shortContent' => $shortContent - )); + $project = new ProjectManager($_POST['name'], $_POST['link'], $_POST['content'], $_POST['shortContent'], $_POST['id']); + $project->sendProject(); } public function deleteBlogPost($link){ - $title = str_replace("-", " ", $link); - - $db = $this->dbConnect(); - $req = $db->prepare('DELETE FROM l3m_blog WHERE title = :title'); - $req->execute(array( - 'title' => $title - )); + $blog = new BlogManager(NULL, NULL, NULL, NULL, NULL, NULL); + $blog->deleteBlogPost($link); } public function deleteProject($link){ - $name = str_replace("-", " ", $link); - - $db = $this->dbConnect(); - $req = $db->prepare('DELETE FROM l3m_projects WHERE name = :name'); - $req->execute(array( - 'name' => $name - )); + $project = new ProjectManager(NULL, NULL, NULL, NULL, NULL); + $project->deleteProject($link); } } \ No newline at end of file diff --git a/site/model/Base.php b/site/model/Base.php index 616680e..6a22046 100644 --- a/site/model/Base.php +++ b/site/model/Base.php @@ -1,4 +1,5 @@ <?php +// connexion à la bdd class Base { protected function dbConnect() diff --git a/site/model/BlogManager.php b/site/model/BlogManager.php index ca267d1..2236d41 100644 --- a/site/model/BlogManager.php +++ b/site/model/BlogManager.php @@ -1,35 +1,104 @@ <?php class BlogManager extends Base { - public function getBlog($page) - { - $start = $page*5; - $stop = $start + 5; + private $time; + private $title; + private $content; + private $shortContent; + private $comments; + private $id; - $db = $this->dbConnect(); - $req = $db->query('SELECT * FROM l3m_blog ORDER BY id DESC LIMIT '. $start .', '. $stop .''); + function __construct($time, $title, $content, $shortContent, $comments, $id){ + $this->time = htmlspecialchars($time); + $this->title = htmlspecialchars($title); + $this->content = htmlspecialchars($content); + $this->shortContent = htmlspecialchars($shortContent); + if($comments == "on") + $this->comments = 1; + else + $this->comments = 0; + $this->id = htmlspecialchars($id); - return $req; - } + } - public function getBlogPost($link) - { + public function getPage($page) + { + $start = $page*5; + $stop = $start + 5; - $link = htmlspecialchars($link); + $db = $this->dbConnect(); + $req = $db->query('SELECT * FROM l3m_blog ORDER BY id DESC LIMIT '. $start .', '. $stop .''); - $title = str_replace("-", " ", $link); + return $req; + } - $db = $this->dbConnect(); - $req = $db->prepare('SELECT * FROM l3m_blog WHERE title = ?'); - $req->execute(array($title)); - $post = $req->fetch(); + public function get($link) + { - if($post == false) - return false; + $link = htmlspecialchars($link); - $post["link"] = urlencode($link); - $post['datetime'] = new DateTime($post['time']); + $title = str_replace("-", " ", $link); - return $post; - } + $db = $this->dbConnect(); + $req = $db->prepare('SELECT * FROM l3m_blog WHERE title = ?'); + $req->execute(array($title)); + $post = $req->fetch(); + + if($post == false) + return false; + + $post["link"] = urlencode($link); + $post['datetime'] = new DateTime($post['time']); + + return $post; + } + + // todo vérifier qu'on poste pas un truc vide + public function update(){ + $db = $this->dbConnect(); + $req = $db->prepare('UPDATE l3m_blog SET time = :time, title = :title, content = :content, shortContent = :shortContent, comments = :comments WHERE id = :id'); + $req->execute(array( + 'time' => $this->time, + 'title' => $this->title, + 'content' => $this->content, + 'shortContent' => $this->shortContent, + 'comments' => $this->comments, + 'id' => $this->id + )); + } + + public function send(){ + + if($this->time == ""){ + $this->time = new datetime(); + $this->time = $this->time->format('Y-m-d H:i:s'); + } + if(strlen($this->title) < 1){ + header("Location:/patate"); + exit(); + } + if(strlen($this->shortContent) < 1){ + $this->shortContent = "Ce billet de blog ne dispose d'aucune description."; + } + $db = $this->dbConnect(); + $req = $db->prepare('INSERT INTO l3m_blog(time, title, content, shortcontent, comments) VALUES(:time, :title, :content, :shortContent, :comments)'); + $req->execute(array( + 'time' => $this->time, + 'title' => $this->title, + 'content' => $this->content, + 'shortContent' => $this->shortContent, + 'comments' => $this->comments + )); + } + + + public function delete($link){ + $title = str_replace("-", " ", $link); + + $db = $this->dbConnect(); + $req = $db->prepare('DELETE FROM l3m_blog WHERE title = :title'); + $req->execute(array( + 'title' => $title + )); + } } \ No newline at end of file diff --git a/site/model/ProjectsManager.php b/site/model/ProjectsManager.php index bde2f3f..d8e1b89 100644 --- a/site/model/ProjectsManager.php +++ b/site/model/ProjectsManager.php @@ -1,27 +1,82 @@ <?php class ProjectManager extends Base { - public function getProjects() - { - $db = $this->dbConnect(); - $req = $db->query('SELECT * FROM l3m_projects ORDER BY id DESC'); + private $name; + private $link; + private $content; + private $shortContent; + private $id; + + function __construct($name, $link, $content, $shortContent, $id){ + $this->name = htmlspecialchars($name); + $this->link = htmlspecialchars($link); + $this->content = htmlspecialchars($content); + $this->shortContent = htmlspecialchars($shortContent); + $this->id = htmlspecialchars($id); + } + + public function getProjects() + { + $db = $this->dbConnect(); + $req = $db->query('SELECT * FROM l3m_projects ORDER BY id DESC'); + + return $req; + } - return $req; - } + public function get($link) + { + $link = htmlspecialchars($link); + $name = str_replace("-", " ", $link); - public function getProject($link) - { - $link = htmlspecialchars($link); - $name = str_replace("-", " ", $link); + $db = $this->dbConnect(); + $req = $db->prepare('SELECT * FROM l3m_projects WHERE name = ?'); + $req->execute(array($name)); + $project = $req->fetch(); + if($project == false) + return false; + + return $project; + } + + // todo vérifier qu'on poste pas un truc vide + public function update(){ + $db = $this->dbConnect(); + $req = $db->prepare('UPDATE l3m_projects SET name = :name, link = :link, content = :content, shortContent = :shortContent WHERE id = :id'); + $req->execute(array( + 'name' => $this->name, + 'link' => $this->link, + 'content' => $this->content, + 'shortContent' => $this->shortContent, + 'id' => $this->id + )); + } + + public function send(){ + if(strlen($this->name) < 1){ + header("Location:/patate"); + exit(); + } + if(strlen($this->shortContent) < 1){ + $this->shortContent = "Pas de description."; + } $db = $this->dbConnect(); - $req = $db->prepare('SELECT * FROM l3m_projects WHERE name = ?'); - $req->execute(array($name)); - $project = $req->fetch(); - - if($project == false) - return false; - - return $project; - } + $req = $db->prepare('INSERT INTO l3m_projects(name, link, content, shortcontent) VALUES(:name, :link, :content, :shortContent)'); + $req->execute(array( + 'name' => $this->name, + 'link' => $this->link, + 'content' => $this->content, + 'shortContent' => $this->shortContent + )); + } + + public function delete($link){ + $title = str_replace("-", " ", $link); + + $db = $this->dbConnect(); + $req = $db->prepare('DELETE FROM l3m_projects WHERE name = :name'); + $req->execute(array( + 'name' => $title + )); + } } \ No newline at end of file diff --git a/site/model/config.php b/site/model/config.php new file mode 100644 index 0000000..f9f7e0e --- /dev/null +++ b/site/model/config.php @@ -0,0 +1,17 @@ +<?php + +// config file +// rename this file config.php + + + // database config + + define('dbName', 'l3m'); + define('dbUser', 'corentin'); + define('dbPass', 'mariadbpsswd'); + + + // login config + + define('user', 'corentin'); + define('pass', '$2y$10$k55Qz7eRbb5V2Ctcx9DeK.WfS5iVgpaWLv99RBeauUFsfIJV3WYwm'); \ No newline at end of file diff --git a/site/view/public/changelog.php b/site/view/public/changelog.php index 29c1e51..185eb98 100755 --- a/site/view/public/changelog.php +++ b/site/view/public/changelog.php @@ -1,5 +1,14 @@ <article> - <h3>14/01/19 (encore)</h3> + <h3>04/02/19</h3> + <ul> + <li>Ajout de commentaires au code</li> + <li>Modification du fichier urlrewriting.txt (nouveau contenu = contenu du fichier nomdusite.conf de apache)</li> + <li>Changement des classes BlogManager & ProjectManager ; déplacement du code depuis AdminManager</li> + </ul> +</article> + +<article> + <h3><a href="https://git.bitmycode.com/sodimel/l3m-website/commit/8f90b9e5bafe27fd6486ab3ce806762c4e86ec96" title="8f90b9e5">14/01/19</a> (encore)</h3> <ul> <li>Ajout d'un fichier "l3m.sql" pour montrer la base de données (supression du fichier sql.txt)</li> diff --git a/urlrewriting.txt b/urlrewriting.txt index 8d1cf12..78516c8 100644 --- a/urlrewriting.txt +++ b/urlrewriting.txt @@ -1,3 +1,28 @@ -RewriteEngine On - RewriteRule /(about|changelog|blog|rss|projects|contact|patate|eplucher)$ /index.php?action=$1 - RewriteRule /article/([a-zA-Z0-9\-]*)$ /index.php?action=blog&title=$1 \ No newline at end of file +<VirtualHost *:80> + + ServerName l3m.local + Serveralias www.l3m.local + + ServerAdmin corentin@ + DocumentRoot /path/to/l3m-website + + Options Indexes FollowSymLinks MultiViews + + ErrorDocument 404 /index.php?action=404 + + RewriteEngine On + RewriteRule ^/(about|changelog|blog|rss|projects|contact|patate|eplucher)$ /index.php?action=$1 + RewriteRule ^/article/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)$ /index.php?action=blog&title=$1 + RewriteRule ^/project/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)$ /index.php?action=project&title=$1 + RewriteRule ^/patate/blog/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)/edit$ /index.php?action=patate&title=$1&editb + RewriteRule ^/patate/blog/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)/delete$ /index.php?action=patate&title=$1&deleteb + RewriteRule ^/patate/blog/submit$ /index.php?action=patate&submitb + RewriteRule ^/patate/blog/edit$ /index.php?action=patate&editb + RewriteRule ^/patate/blog/send$ /index.php?action=patate&sendb + RewriteRule ^/patate/project/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)/edit$ /index.php?action=patate&title=$1&editp + RewriteRule ^/patate/project/([a-zA-Z0-9\-:!?+.;/,\%9áà âäãåçéèêëÃìîïñóòôöõúùûüýÿæœÃÀÂÄÃÅÇÉÈÊËÃÌÎÃÑÓÒÔÖÕÚÙÛÜßƌ]*)/delete$ /index.php?action=patate&title=$1&deletep + RewriteRule ^/patate/project/submit$ /index.php?action=patate&submitp + RewriteRule ^/patate/project/edit$ /index.php?action=patate&editp + RewriteRule ^/patate/project/send$ /index.php?action=patate&sendp + +</VirtualHost> -- GitLab