Visualizzazione risultati 1 fino 16 di 16

Discussione: Problemi con htaccess e frontcontroller

  1. #1
    Guest

    Predefinito Problemi con htaccess e frontcontroller

    Ho acquistato un dominio per la mia applicazione web (www.shoes-market.org), ho caricato la mia applicazione che funziona correttamente in locale ma su Altervista ho problemi di reindirizzamento.
    La pagina principale (index.php) viene aperta ma poi quando provo a richiamare qualunque altra pagina html mi ritorna un errore 404 il che è impossibile dato che i file ci sono tutti.
    Non so se dipende dalla configurazione dell'htaccess oppure dal mio FrontCrontoller.

    Vi metto il codice di entrambi

    htaccess

    Codice:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www\.shoes-market\.org$
    RewriteRule ^(.*) https://www.shoes-market.org/index.php [R=301,L]
    </IfModule>
    CFrontController

    Codice PHP:
    class CFrontController
    {
    /**
    * Metodo che viene richiamato ogni volta che viene effettuata una richiesta all'interno del sito. Si
    occupa di richiamare i vari controllori necessari per l'esecuzione della richiesta effettuata (con
    eventuali parametri).
    * @param string $path
    */
    public static function run(string $path)
    {
    ini_set('session.gc_probability', 10);
    ini_set('session.gc_maxlifetime', 3600);
    error_reporting(E_ERROR | E_PARSE);
    $gs = CGestioneSessioni::getInstance();
    $input = new VGestioneInput();
    $valore_cookietest = $input->passaInputValoreCookieTest();
    if (
    $gs->isLoggedCust() || $gs->isLoggedAdmin()) {
    if (
    $path === "www.shoes-market.org" || $path === "www.shoes-market.org/index.php") {
    setcookie("cookie_test", "cookie_value");
    CGestioneSchermate::recuperaHome();
    } else {
    error_reporting(E_ERROR | E_PARSE);
    if (
    $valore_cookietest == "cookie_value") {
    $cookie = true;
    } else {
    $cookie = false;
    }
    if (
    $cookie == true) {
    $gs = CGestioneSessioni::getInstance();
    $res = explode("/", $path);
    array_shift($res);
    array_shift($res);
    array_shift($res);
    if (
    $res[0] != '') {
    $controller = "C" . $res[0];
    $dir = 'Controller';
    $eledir = scandir($dir);
    if (
    in_array($controller . ".php", $eledir)) {
    if (isset(
    $res[1])) {
    $function = $res[1];
    if (
    method_exists($controller, $function)) {
    $param = array();
    for (
    $i = 2; $i < count($res); $i++) {
    $param[] = $res[$i];
    }
    $num = count($param);
    if (
    $num == 0) $controller::$function();
    else if (
    $num == 1) $controller::$function($param[0]);
    else if (
    $num == 2) $controller::$function($param[0], $param[1]);
    }
    }
    }
    } else {
    $controller = "CGestioneSchermate";
    $function = "recuperaHome";
    $controller::$function();
    }
    } else {
    CGestioneSchermate::showCookie();
    }
    }
    } else {
    if (
    $path === "www.shoes-market.org" || $path === "www.shoes-market.org/index.php") {
    setcookie("cookie_test", "cookie_value");
    CGestioneSchermate::showHome();
    } else {
    error_reporting(E_ERROR | E_PARSE);
    if (
    $valore_cookietest == "cookie_value") {
    $cookie = true;
    } else {
    $cookie = false;
    }
    if (
    $cookie == true) {
    $gs = CGestioneSessioni::getInstance();
    $res = explode("/", $path);
    array_shift($res);
    array_shift($res);
    array_shift($res);
    if (
    $res[0] != '') {
    $controller = "C" . $res[0];
    $dir = 'Controller';
    $eledir = scandir($dir);
    if (
    in_array($controller . ".php", $eledir)) {
    if (isset(
    $res[1])) {
    $function = $res[1];
    if (
    method_exists($controller, $function)) {
    $param = array();
    for (
    $i = 2; $i < count($res); $i++) {
    $param[] = $res[$i];
    }
    $num = count($param);
    if (
    $num == 0) $controller::$function();
    else if (
    $num == 1) $controller::$function($param[0]);
    else if (
    $num == 2) $controller::$function($param[0], $param[1]);
    }
    }
    }
    } else {
    $controller = "CGestioneSchermate";
    $function = "showHome";
    $controller::$function();
    }
    } else {
    CGestioneSchermate::showCookie();
    }
    }
    }
    }
    }
    Tutti i metodi richiamati nelle varie pagine html sono all'interno di una cartella Controllere devono passare sempre per il FrontController.

    Spero che qualcuno possa aiutarmi con il mio problema
    Ultima modifica di dreadnaut : 21-01-2023 alle ore 16.38.01 Motivo: + tag [php] per il codice

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,252

    Predefinito

    Citazione Originalmente inviato da avid3903116 Visualizza messaggio
    Codice:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www\.shoes-market\.org$
    RewriteRule ^(.*) https://www.shoes-market.org/index.php [R=301,L]
    </IfModule>
    Queste righe sono una redirezione da altri indirizzi verso il tuo dominio, ma non c'è niente che richiami il front controller. È lo stesso codice che usi in locale?

    Ci vorrebbe almeno qualcosa tipo:
    Codice:
    # Se la richiesta non punta ad un file esistente
    RewriteCond %{REQUEST_FILENAME} !-f
    # Passala al front controller assieme alla query string
    RewriteRule ^(.*)$  index.php?path=$1  [QSA,L]

  3. #3
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    3,978

    Predefinito

    Salve,
    dal messaggio di errore 404, risulta che non viene indicato alcun dominio come percorso della pagina errata.



    Generalmente, se ad esempio la pagina errata fosse /aaa, il messaggio si presenterà così:
    The page http://NomeSito.altervista.org/aaa was not found on this server.
    Mentre nel suo caso appare:
    The page http:// was not found on this server.
    Sta usando la stessa versione di PHP e configuarzione dell'applicativo sia in locale che su AlterVista?

    Cordiali saluti.
    Ultima modifica di GraphOGLRisorse : 21-01-2023 alle ore 21.28.07

  4. #4
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Queste righe sono una redirezione da altri indirizzi verso il tuo dominio, ma non c'è niente che richiami il front controller. È lo stesso codice che usi in locale?

    Ci vorrebbe almeno qualcosa tipo:
    Codice:
    # Se la richiesta non punta ad un file esistente
    RewriteCond %{REQUEST_FILENAME} !-f
    # Passala al front controller assieme alla query string
    RewriteRule ^(.*)$  index.php?path=$1  [QSA,L]
    Il frontcontroller è richiamato nel file index.php, te lo inoltro qui sotto

    Codice:
    <?php
    require_once "autoloader.php";
    require_once "config.php";
    require('StartSmarty.php');
    
    
    $fcontroller = new CFrontController();
    $fcontroller->run($_SERVER['REQUEST_URI']);
    Ultima modifica di avid3903116 : 26-01-2023 alle ore 13.03.07

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da GraphOGLRisorse Visualizza messaggio
    Salve,
    dal messaggio di errore 404, risulta che non viene indicato alcun dominio come percorso della pagina errata.



    Generalmente, se ad esempio la pagina errata fosse /aaa, il messaggio si presenterà così:

    Mentre nel suo caso appare:


    Sta usando la stessa versione di PHP e configuarzione dell'applicativo sia in locale che su AlterVista?

    Cordiali saluti.
    Si sto usando esattamente lo stesso progetto. Penso di aver qualche erorre per il reindirizzamento nel file htaccess o nel frontcontroller.

    Inizialmente riesco ad entrare nella pagina iniziale del sito, ma da lì in poi ho sempre quell'errore che dici tu

  6. #6
    Guest

    Predefinito

    In locale ho usato questo file config.php che viene incluso nell'index.php

    Codice:
    <?php
    
    $hostname="127.0.0.1";
    $dbname="my_avid3903116";
    $user="root";
    $pass="pippo";
    
    //$GLOBALS["path"] = "/~cipri/Shoes-Market/";
    Su altervista ho commentato la riga relativa al Global path, pensando che non sono più in locale.
    Riflettendoci, nei vari template ho continuamente dei reidirizzamenti attraverso questo array globale.
    Magari devo modificare anche l'assegnazione a $GLOBALS["path"]?

  7. #7
    Guest

    Predefinito

    Vi inoltro anche il file .htaccess che ho usato in locale con il quale il sito funziona bene in locale.
    E' possibile usare lo stesso identico file su altervista?

    Codice:
    <IfModule mod_rewrite.c>
    
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /~cipri/Shoes-Market/index.php [L]
    </IfModule>

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,252

    Predefinito

    Ad occhio direi di si. In particolare, queste due righe sono essenziali:
    Codice:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /~cipri/Shoes-Market/index.php [L]
    Su AlterVista (ma anche in locale probabilmente) puoi eliminare il path ed usare solo
    Codice:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
    Aggiungerei quel QSA in modo da passare eventuali parametri al front controller.

    Incerto su come il front controller riceva quel parametro $path:
    Codice PHP:
    public static function run(string $path)
    ma assumo che se funziona in locale, un meccanismo ci sarà

  9. #9
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    1) Dovrai utilizzare il file .htaccess nella root
    Codice:
    <IfModule mod_rewrite.c>
    
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www\.shoes-market\.org$
    RewriteRule ^(.*) https://www.shoes-market.org/index.php [L,R=301]
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://www.shoes-market.org%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /
    sta effettuando un redirect interno alla root e se esiste index.php (se configurato il server web per mostrare una index predefinita esegue il codice di index.php) e non occorre il flags QSA perché non stai creando manualmente una query string o ricerca di un percorso.

    2) Può darsi poiché una variabile
    Codice PHP:
    $path = dirname(dirname(__FILE__));
    $GLOBALS['path'] = $path;
    in ambito globale $path è uguale a $GLOBALS['path']

  10. #10
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Ad occhio direi di si. In particolare, queste due righe sono essenziali:
    Codice:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /~cipri/Shoes-Market/index.php [L]
    Su AlterVista (ma anche in locale probabilmente) puoi eliminare il path ed usare solo
    Codice:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
    Aggiungerei quel QSA in modo da passare eventuali parametri al front controller.

    Incerto su come il front controller riceva quel parametro $path:
    Codice PHP:
    public static function run(string $path)
    ma assumo che se funziona in locale, un meccanismo ci sarà
    Il front controller riceve quel parametro attraverso l'index. Posto di seguito il codice:

    Codice:
    <?php
    require_once "autoloader.php";
    require_once "config.php";
    require('StartSmarty.php');
    
    
    $fcontroller = new CFrontController();
    $fcontroller->run($_SERVER['REQUEST_URI']);
    Attraverso questo parametro $_SERVER['REQUEST_URI']

  11. #11
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    1) Dovrai utilizzare il file .htaccess nella root
    Codice:
    <IfModule mod_rewrite.c>
    
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www\.shoes-market\.org$
    RewriteRule ^(.*) https://www.shoes-market.org/index.php [L,R=301]
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://www.shoes-market.org%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . /
    sta effettuando un redirect interno alla root e se esiste index.php (se configurato il server web per mostrare una index predefinita esegue il codice di index.php) e non occorre il flags QSA perché non stai creando manualmente una query string o ricerca di un percorso.

    2) Può darsi poiché una variabile
    Codice PHP:
    $path = dirname(dirname(__FILE__));
    $GLOBALS['path'] = $path;
    in ambito globale $path è uguale a $GLOBALS['path']
    Ho provato a copiare il file htaccess che mi hai inviato e ho sostituito anche l'array $GLOBALS ma non ha funzionato

  12. #12
    Guest

    Predefinito

    Codice:
    <?php
    
    /**
     * CFrontController gestisce i vari reindirizzamenti all'interno del sito.
     * Class CFrontController
     */
    class CFrontController
    {
        /**
         * Metodo che viene richiamato ogni volta che viene effettuata una richiesta all'interno del sito. Si occupa di richiamare i vari controllori necessari per l'esecuzione della richiesta effettuata (con eventuali parametri).
         * @param string $path
         */
        public static function run(string $path)
        {
            ini_set('session.gc_probability', 10);
            ini_set('session.gc_maxlifetime', 3600);
            error_reporting(E_ERROR | E_PARSE);
            $gs = CGestioneSessioni::getInstance();
            $input = new VGestioneInput();
            $valore_cookietest = $input->passaInputValoreCookieTest();
            if ($gs->isLoggedCust() || $gs->isLoggedAdmin()) {
                if ($path === "/index.php" ||  $path === "https://www.shoes-market.org/index.php" ||  $path === "/") {
                    setcookie("cookie_test", "cookie_value");
                    CGestioneSchermate::recuperaHome();
                } else {
                    error_reporting(E_ERROR | E_PARSE);
                    if ($valore_cookietest == "cookie_value") {
                        $cookie = true;
                    } else {
                        $cookie = false;
                    }
                    if ($cookie == true) {
                        $gs = CGestioneSessioni::getInstance();
                        $res = explode("/", $path);
                        array_shift($res);
                        array_shift($res);
                        array_shift($res);
                        if ($res[0] != '') {
                            $controller = "C" . $res[0];
                            $dir = 'Controller';
                            $eledir = scandir($dir);
                            if (in_array($controller . ".php", $eledir)) {
                                if (isset($res[1])) {
                                    $function = $res[1];
                                    if (method_exists($controller, $function)) {
                                        $param = array();
                                        for ($i = 2; $i < count($res); $i++) {
                                            $param[] = $res[$i];
                                        }
                                        $num = count($param);
                                        if ($num == 0) $controller::$function();
                                        else if ($num == 1) $controller::$function($param[0]);
                                        else if ($num == 2) $controller::$function($param[0], $param[1]);
                                    }
                                }
                            }
                        } else {
                            $controller = "CGestioneSchermate";
                            $function = "recuperaHome";
                            $controller::$function();
                        }
                    } else {
                        CGestioneSchermate::showCookie();
                    }
                }
            } else {
                if ($path === "/index.php" ||  $path === "https://www.shoes-market.org/index.php" ||  $path === "/") {
                    setcookie("cookie_test", "cookie_value");
                    CGestioneSchermate::showHome();
                } else {
                    error_reporting(E_ERROR | E_PARSE);
                    if ($valore_cookietest == "cookie_value") {
                        $cookie = true;
                    } else {
                        $cookie = false;
                    }
                    if ($cookie == true) {
                        $gs = CGestioneSessioni::getInstance();
                        $res = explode("/", $path);
                        array_shift($res);
                        array_shift($res);
                        array_shift($res);
                        if ($res[0] != '') {
                            $controller = "C" . $res[0];
                            $dir = 'Controller';
                            $eledir = scandir($dir);
                            if (in_array($controller . ".php", $eledir)) {
                                if (isset($res[1])) {
                                    $function = $res[1];
                                    if (method_exists($controller, $function)) {
                                        $param = array();
                                        for ($i = 2; $i < count($res); $i++) {
                                            $param[] = $res[$i];
                                        }
                                        $num = count($param);
                                        if ($num == 0) $controller::$function();
                                        else if ($num == 1) $controller::$function($param[0]);
                                        else if ($num == 2) $controller::$function($param[0], $param[1]);
                                    }
                                }
                            }
                        } else {
                            $controller = "CGestioneSchermate";
                            $function = "showHome";
                            $controller::$function();
                        }
                    } else {
                        CGestioneSchermate::showCookie();
                    }
                }
            }
        }
    }
    Ho modificato il front controller dopo i cambiamenti suggeriti, ora il sito a livello di funzionalità funziona correttamente. Il file config l'ho impostato in questo modo:

    Codice:
    <?php
    
    $hostname="127.0.0.1";
    $dbname="my_avid3903116";
    $user="root";
    $pass="pippo";
    
    $GLOBALS["path"] = "/~cipri/Shoes-Market/";
    L'unico problema che rimane è che non viene applicato il css
    Ultima modifica di avid3903116 : 27-01-2023 alle ore 18.06.35

  13. #13
    GraphOGLRisorse non è connesso AlterGuru 2500
    Data registrazione
    14-02-2015
    Messaggi
    3,978

    Predefinito

    Allora, ho controllato gli url della index con quelli delle altre pagine ed emerge quanto segue:

    Ad esempio per style.css, nella index viene generato l'url correto:
    /Smarty/smarty-dir/assets/css/style.css

    mentre nella home (come nelle elatre pagine), viene generato così:
    /~cipri/Shoes-Market/GestioneSchermate/Smarty/smarty-dir/assets/css/style.css

    Questa parte del percorso è di troppo /~cipri/Shoes-Market/GestioneSchermate/ Non conoscendo front controller non ho idea di dove sia il problema, ma penso sia legato sempre ad una qualche configurazione errata.

    Cordiali saluti.
    Ultima modifica di GraphOGLRisorse : 27-01-2023 alle ore 19.32.48 Motivo: correzione stesura

  14. #14
    Guest

    Predefinito

    Si esatto era proprio quello il problema.

    Usando /Smarty/smarty-dir/ecc.. ora funziona perfettamente!

    Grazie a tutti

  15. #15
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Se ho ben capito config.php è aggiunto con include in index.php però non puoi usare la costante __FILE__ in index.php bene il percorso root è /membri/tuo_nic/
    Se crei file darbulaconf.php
    Codice PHP:
    $path = dirname(dirname(__FILE__)) . '/'; // aggiunto slash finale
    $GLOBALS['path'] = $path;
    var_dump($path);
    e crei darbulaoutput.php
    Codice PHP:
    include dirname(dirname(__FILLE__)) . '/darbulaconf.php';
    var_dump("conf $path");
    Giustamente da browser apri https://www.shoes-market.org/darbulaoutput.php
    È evidente che $_SERVER['REQUEST_URI']; non è utilizzato ovunque sicuramente su index.php (ma altre pagine potrebbero utilizzare $path).
    Ultima modifica di darbula : 27-01-2023 alle ore 19.35.46

  16. #16
    Guest

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Se ho ben capito config.php è aggiunto con include in index.php però non puoi usare la costante __FILE__ in index.php bene il percorso root è /membri/tuo_nic/
    Se crei file darbulaconf.php
    Codice PHP:
    $path = dirname(dirname(__FILE__)) . '/'; // aggiunto slash finale
    $GLOBALS['path'] = $path;
    var_dump($path);
    e crei darbulaoutput.php
    Codice PHP:
    include dirname(dirname(__FILLE__)) . '/darbulaconf.php';
    var_dump("conf $path");
    Giustamente da browser apri https://www.shoes-market.org/darbulaoutput.php
    È evidente che $_SERVER['REQUEST_URI']; non è utilizzato ovunque sicuramente su index.php (ma altre pagine potrebbero utilizzare $path).
    Puoi controllare cortesemente se visualizzi correttamente il sito adesso?

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •