PHP-Fusion-GERMANY / PHP-Fusion

Vom deutschen Team weiterentwickelter Fork
http://phpfusion-deutschland.de
6 stars 3 forks source link

SEF Links #2

Open Webmeteor opened 8 years ago

Webmeteor commented 8 years ago

Nach welcher Art?

  1. viewpage.php?pageid=1&pagename
  2. viewpage/1/pagename
  3. viewpage_1_pagename
  4. ist relativ einfach zu realisieren, habe aber noch keine Erfahrungswerte
  5. so wie in allen anderen Systemen auch, Nachteil ist, das für CSS und javascript hinzubekommen, genauso das Forum (hatten damals da beim SEO-Fusion richtig Probleme bekommen)
  6. auch relativ einfach zu realisieren. Produziert schon einen deutlichen Ranking Schub.

Und muss zwingend ein Fallback für mod_rewrite off da sein? Ich denke es gibt mittlerweile keinen Hoster mehr, der mod_rewrite nicht zur Verfügung stellt.

Layzee0815 commented 8 years ago

Fallback brauchen wir denke ich nicht für mod_rewrite, auch wenn es bei Freehostern oft abgeschaltet ist. Variante 2 halte ich für sinnvoll.

SGIFusion commented 8 years ago

Ich würde auch eher zu Variante zwei stimmen (da ich ab und an gerne auf links schaue wie sie heissen).

zu Eins wäre der sogenannte fast alstand vorhanden und zur Drei keine tolle unterstrich ansicht

zum Thema mod_rewrite sind es noch vereinzelte aber das ist zu verkraften denn wer ein Projekt aufbauen will hat immer die Monatliche option der Kündigung um etwas zu investieren ;)

Webmeteor commented 8 years ago

Dann lass uns alles aus dem Root in den infusions Ordner verschieben. So lassen sich dann auch 3rd Party Infusionen später leichter mit den Links ausstatten, ohne auch nur einmal an die .htaccess ran zu müssen.

So würden im Root dann nur noch .htacccess, index, config, maincore, robots und setup verbleiben.

Würde das dann so ungefähr lösen in der index

$request  = str_replace('.html', "", $_SERVER['REQUEST_URI']);
$request  = str_replace($settings['path'], "", $request);
$request  = preg_replace('/[?](.*)/', "", $request);
#explode the path by '_'
$urlparams = explode("/", $request);

Dann wäre $urlparams[0] immer die aufzurufende Datei im Infusionsordner, bzw. könnte man dort auch die DB rein hängen, so dass der Aufruf auch in der jeweiligen Landessprache erfolgen kann. Dann müsste man auch die Rootdateien nicht zwingend verschieben.

Vorteil: wir haben keine komplexen Regex für das URL-Rewriting, so wie in der V9. Nachteil: Es müsste in jeder Datei, am besten am Anfang, ein Kommentar kommen, welcher $urlparams was macht. Damit es immer Nachvollziehbar bleibt.

Layzee0815 commented 8 years ago

Der letzte Satz deines Posts führt die Idee ansich wieder ad absurdum ;) Wie hoch ist die Wahrscheinlichkeit, dass man als Entwickler von Addons, insbesondere Infusionen den genauen Überblick behält? Wir sollten denke ich so wenig wie möglich an der bekannten und gewohnten Dateistruktur und den Verzeichnisbäumen ändern. In meinen Augen ist es eher suboptimal, erst die ursprüngliche Pfadlänge zu "verlängern" und sie dann wieder künstlich zu "verkürzen" durch irgendwelche in Stein gemeisselten Pfadkonstanten. Das kostet Flexibilität. Behaltet bitte auch im Fokus, dass die V7.3 nach Möglichkeit auch als Update verfügbar sein soll.

iPaat commented 8 years ago

Hallo zusammen, die Kunst bei SEO ist die Übersetzung der URL auf das FileSystem. Das Problem an SEO ist, dass es nicht Anfänger freundlich ist. In allen PHP Tutorien lernt man die URL auf das FileSystem zu übertragen:

/forum/index.php
   ^         ^
Ordner    Datei

Jetzt muss aber die URL:

/forum/post-1

Forum = eventuell ein Ordner oder eine Datei :confused: Post = GET-VarName 1 = GET-WERT

Übertragen werden. Dies ist ohne Struktur nicht ohne weiteres umzusetzen geschweige denn für einen Anfänger zu verstehen. Weiter war es früher so dass man alle Regeln in die .htaccess geschrieben hat. Heute steht dort nur noch eine Regel drin die auf eine Zentrale Datei verweist in der sich dann um die Übersetzung gekümmert wird.

Was machen wir nun?

Der Vorschlag

Wir müssen die URL erst mal intern selber übersetzen. Daher schlage ich der Einfachheit halber vor, die Rewrite Regeln für Core Elemente im includes Ordner abzulegen:

/includes/rewrites/forum.php
/includes/rewrites/user.php

Wie erkennt das System nun welche Datei er laden muss?

Dies kann man in der URL ablesen. Lautet die URL:

/forum/post-1
  ^
Keyword

dann nehmen wir das erste Wort als Keyword und suchen im /includes/rewrites/ Ordner nach der Datei mit dem Keyword. Gibt es diese nicht, schauen wir im Infusions Ordner weiter.

Wie werden Infusionen gehandhabt?

Infusionen kommen derzeit mit 2 Dateien:

Wir können die infusion.php um die Regeln für das SEO erweitern. Zum Beispiel die URL:

/friend-system/add-1
  ^
Keyword

Das Keyword lautet friend-system also sucht das System in /includes/rewrites/ nach den Regeln. Diese wird es aber dort nicht finden da es sich hier nicht um ein Core Element handelt. Es wird dann weiter im Infusions Ordner gesucht und dort gibt es einen Ordner der heißt friend-system. Das System läd die infusions.php und damit die SEO Regeln. Sollte kein entsprechender Ordner gefunden werden, dann gibt das System 404 zurück.

Was sind die SEO Regeln?

Die SEO Regeln beinhalten die Informationen darüber welcher Teil der URL Parameter sind. Diese Parameter müssen dann automatisch in $_GET Variablen übersetzt werden. Außerdem müssen die Regeln die Ziele enthalten. Welche Datei soll geladen werden.

Vorteile

Nachteile

globeFrEak commented 8 years ago

Finde ich sehr gut und auch einfach zu verstehen.

Warum könnte es an manchen Stellen unflexibel sein, und welche wären das? :confused:

Können wir nicht eine "Link Funktion" schreiben die vorher prüft ob eine Rewrite Regel für eine Infusion existiert. Erst wenn diese TRUE ist wird ein SEO Link ausgeliefert und wenn nicht dann ein normaler.

Beispiel an Profil Link Funktion: function profile_link($user_id, $user_name, $user_status, $class = "profile-link", $seo = TRUE) { .... }

Webmeteor commented 8 years ago

@SuNflOw1991 Das wäre ja dann mein Codeschnippsel, der ja nur auf Fusion angepasst werden muss und natürlich noch optimiert. Und wenn alles im Infusions Ordner landet, dann ist es kein Problem mehr.

Der Entwickler weiss ja dann nachher, dass die 0 für die Infusion steht und der Rest also ab 1 zu seiner Verfügung steht.

globeFrEak commented 8 years ago

Wie wollen wir es nun machen?

iPaat commented 8 years ago

Ich denke an https://github.com/PHP-Fusion-GERMANY/PHP-Fusion/issues/2#issuecomment-225803403 hat niemand etwas auszusetzen. Bekommst du das hin oder soll ich dir dabei helfen? Vielleicht das "Grundgerüst" fertigstellen so dass man dann nach und nach einzelne Bestandteile umschreiben kann?

globeFrEak commented 8 years ago

Ich würde es probieren und wenn ich nicht klar komme dann Schreie ich einfach.

globeFrEak commented 8 years ago

Warum hast du diesen Issue geschlossen?

iPaat commented 8 years ago

Eines deiner commit Nachrichten hieß: PDO Close #2 Github erkennt Close #2 automatisch und hat daher dieses Issue geschlossen.

Vielen Dank für deinen Hinweis ich werde es wieder öffnen.

globeFrEak commented 8 years ago

OK, kommt nicht wieder vor :+1:

globeFrEak commented 8 years ago

Ich muss um Hilfe bitten, mir ist immer noch nicht bewusst geworden wie es ohne .htaccess oder mod_rewrite gehen soll?! Wir sprechen aber schon von einer Lösung wo keine .htaccess oder Config Änderungen am Webserver vorgenommen werden müssen?! Falls ja dann habe ich dazu auch keinen Ansatz im Netz gefunden.

Wenn ich das SEF in PHP-Fusion 9 anschaue dann ist das nicht für mich "einfach zu implementieren" :disappointed:

iPaat commented 8 years ago

Also die .htaccess muss einmal angepasst werden. Diese zeigt dann auf eine einzige Datei. Den Rest übernimmst dann PHP. PHP löst dann den Pfad auf indem es nach einer passenden Datei im includes/rewrite/ Verzeichnis sucht. Leider kann ich ein Grundgerüst erst am Freitag programmieren.

Aber GANZ ohne .htaccess Datei geht es nicht. Ein rewrite muss dort drin stehen und zwar zur Datei, die den Pfad auflöst.

Webmeteor commented 8 years ago

Die .htaccess

`RewriteEngine on

DeineDomain ohne http://www.

RewriteCond %{HTTP_HOST} ^deinedomain.de/htdocs/$ [NC]

DeineDomain mit http://www.

RewriteRule ^(.*)$ http://www.deinedomain.de/htdocs/$1 [R=301,L]

ab hier nichts mehr ändern.

RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^.*$ ./index.php`

jetzt muss die index.php den Rest erledigen.

Und schaut Bitte nicht nach, wie die UK's es in der V9 gelöst haben. Das ist der größte Blödsinn, der an Code in der V9 drin ist.

Oben habe ich mal einen Teil gepostet, wie man die URL auflösen könnte. Ds ist die einfachste Methode mit der auch ein Anfänger etwas anfangen kann, anstelle der REGEX Methode in der V9. Und ist von der Performance her auch wesentlich schneller.

Zum generieren einer URL:

function pageurl($seite,$id,$page_title, $params=''){

    $text = strip_tags(trim($page_title));
    //$text = clean($text,'url');

    $replace = array("ae", "ae", "ae", "ae", "ue", "ue", "ue", "ue", "oe", "oe", "oe", "oe", "ss", "-Euro-", "-Euro-", " ", "-und-", " ", " ", " ", " ", " "," "," "," "," "," "," ", " ");
    $search = array("Ä", "ä", "ä", "Ä", "ü", "Ü", "ü", "Ü", "ö", "Ö", "ö", "Ö", "ß", "€", "€", """, "&", " ", "–", "„", "“", "—", "·", "\"", ".", ":", "?", "\'", "!");

    $text = str_replace($search, $replace, $text);

    $text = str_replace(" ", "-", $text);
    $text = str_replace(":", "-", $text);
    $text = str_replace("/", "-", $text);
    $text = str_replace("_", "-", $text);
    //$text = preg_replace("/[^a-zA-Z0-9_-\s]/", "", $text);
    $text = preg_replace("/([\s\s]+|[--]+)/", "-", $text);
    return $seite.'_'.$id.'_'.$text.$params;
}

Müsste dann nur mit in die maincore.php eingepflegt werden. (Angepassterweise natürlich, das stammt aus einem meiner Systeme).

Das ganze hat aber auch zur Folge, dass alles an Dateien, die Inhalte anzeigen als Infusion in den Infusions Ordner müssten, zumindest der Einfachheit halber.

iPaat commented 8 years ago

Lasst uns bitte bis Freitag warten, dann stelle ich das von mir erdachte System vor. Dann können wir abstimmen lassen.

iPaat commented 8 years ago

So, ich habe es jetzt doch noch einen kleinen Prototypen heute fertig bekommen.

/.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([a-zA-Z_0-9\-]+)/(.*)$ ./index.php?key=$1&params=$2 [L]
    RewriteRule ^([a-zA-Z_0-9\-]+)$ ./index.php?key=$1 [L]
</IfModule>

/index.php

<?php
require_once "maincore.php";

if(isset($_GET['key']) && $_GET['key'] != "" && validateGETVal($_GET['key'])) {
    // create a list of files in /includes/rewrite
    $rewriteFolder = makefilelist(INCLUDES."rewrite", ".|..");

    // create a list of folders in /infusions
    $infusionsFolder = makefilelist(INFUSIONS, ".|..", true, "folders");

    $locations = array_merge($infusionsFolder, $rewriteFolder);

    // create an array of possible locations
    $possLocations = array(
        $_GET['key'].".php",    // /includes/rewrite/
        $_GET['key']            // /infusions/__NAME__/
    );

    // find first location match
    $finalLocation = "";
    foreach ($locations as $location) {
        if($location == $possLocations[1] && file_exists(INFUSIONS.$location."/rewrite.php")) {
            $finalLocation = INFUSIONS.$possLocations[1]."/rewrite.php";
            break;
        }

        if($location == $possLocations[0]) {
            $finalLocation = INCLUDES."rewrite/".$possLocations[0];
            break;
        }
    }

    if($finalLocation == "") {
        // no location found = 404
        header("HTTP/1.0 404 Not Found", "", "404");
        $db_connect = null;
        exit;
    }

    require_once $finalLocation;

    $db_connect = null;
    exit;
}

redirect($settings['opening_page']);

$db_connect = null;

/includes/rewrite/news.php

<?php
if (!defined("IN_FUSION")) { die("Access Denied"); }

$rules = array(
    'readmore' => '#^([0-9]+)$#'
);

if(isset($_GET['params'])) {
    if(preg_match($rules['readmore'], $_GET['params'], $matches)) {
        $_GET['readmore'] = $matches[0];
    }
}

include_once BASEDIR."news.php";

Wie funktioniert es im Detail?

Wie oben schon erwähnt wird alles bis zum ersten / als Schlüsselwort verwendet. Dieses wird der index.php als $_GET Variable mitgegeben. Die index.php versucht nun anhand dieses Schlüsselworts die Regeln zu finden um ein Rewrite durchzuführen. Werden die Regeln gefunden, wird die gefundene Datei aufgerufen. Besteht der aufgerufene Link aus mehr als nur dem Schlüsselwort, dann wird alles nach dem Schlüsselwort ebenfalls als $_GET Parameter mitgegeben. Damit kann dann die gefundene Datei arbeiten und daraus ableiten was man machen möchte. Bei den News gibt es da nur eine Möglichkeit und zwar eine bestimmte News anzuzeigen wenn dies gewünscht ist.

Probleme?

Es wird ein bisschen Arbeit sein alles umzuschreiben, da in allen Dateien alle Links angefasst werden müssen. Was die UKs versucht haben ist, Links automatisch per RegEx vor dem Ausliefern zu ändern. Wie wir gesehen haben ist das nicht optimal. Ich denke wir sollten daraus lernen und direkt alle Links umschreiben. Ich denke, dass ist zwar viel Arbeit, die sich aber am Ende lohnen wird.

Weiter habe ich mir keine Gedanken darüber gemacht wie wir Abwärtskompatibilität sicher stellen wollen. Es gibt kein modernes CMS oder Framework welches eine Abwärtskompatibilität sicher stellt. Ich denke wir leben in einer Zeit, in der wir uns darüber keine Gedanken mehr machen müssen. Klar müssten alle Infusionen und so weiter angepasst werden aber (!) - ich denke, dass wenn wir ein gutes CMS auf die Beine stellen, sich schon Entwickler finden, die bestehende Infusionen umschreiben.


Ihr kennt jetzt 2 Vorgehensweisen. Ihr könnt mit einem Daumen hoch abstimmen. Welches die meisten Daumen hoch hat am Ende der Woche, wird dann denke ich umgesetzt.

globeFrEak commented 8 years ago

Jetzt habe ich es kapiert. :muscle:

Vorschlag zwei wäre mein Favorit, einfach weil dort nicht per Hand die .htaccess vom Seitenbetreiber abgepasst werden muss!!

Ich habe schon damit herumgespielt und konnte ein paar Dinge verbessern - zumindest in meinen Augen :eyes: Ich warte aber noch bis Freitag - dann sehen wir was die Mehrheit mag

Webmeteor commented 8 years ago

In meinem Fall muss auch keiner die .htaccess anfassen und ändern, ausser für eine einzige SEO Massnahme, die man aber auch über das setup erledigen kann. Bei @SuNflOw1991 Lösung sehe ich noch einen Nachteil. Es lässt sich nur ein Parameter als GET übertragen. Bei mir sind die Möglichkeiten offen. Und man könnte sich sogar noch eine rewrite.php sparen.

@SuNflOw1991 da ist ein kleiner gedanklicher Fehler bei dir. Es würde bei dir bei readmore abbrechen, da du keine ID als Get mit überträgst, bzw. deine htaccess diese gar nicht zuweisen kann. Du hast lediglich $_GET['key']='news' und $_GET['params']='readmore' aber ansonsten ja nichts. Hiesse bei deiner Lösung müsste die .htaccess noch um einige Codezeilen anwachsen und zwar für jede Infusion. Erinnert mich an das von mir ins Leben gerufene SEO-Fusion. Und was passiert, wenn Fusion in einem Unterordner ist?

Die Abwärtskompatiblität kann man in beiden Fällen nicht wirklich gewährleisten.

Meine index,php (in Teilen) zu meinem Code da oben.

require_once 'main.php';

#remove the directory path we don't want
$request  = str_replace('.html', "", $_SERVER['REQUEST_URI']);
$request  = str_replace($settings['path'], "", $request);
$request  = preg_replace('/[?](.*)/', "", $request);
#explode the path by '/'
$params = explode("/", $request);
// Hier könnte noch eine DB Anfrage kommen, ob die Seite, die aufgerufen werden soll auch wirklich installiert ist. So könnten dann nicht installierte Infusionen, die dennoch im Verzeichnis vorhanden sind ausgeschlossen werden und vor einem Zugriff geschützt werden.
// load reqested page
if($result && file_exists(SEITEN.$params[0].".php")){
    require_once SEITEN.$params[0].".php";
} else {
    // or defined startpage
   header('location: '.$settings['startpage']);
}

jeder der erste / gibt den Ordner an. Alles danach ist für die Entwickler frei verfügbar.

iPaat commented 8 years ago

Du hast das System nicht verstanden, denke ich. In GET['param'] steht alles nach dem ersten / das bedeutet bei einer längeren URL forum/1/thread/1 würde in param stehen 1/thread/1 und damit kann dann die rewrite Datei arbeiten dies dann nach eigenen Regeln bearbeiten.

Ein anpassen der .htaccess ist in KEINEM Fall mehr nötig!

Nach deinem System sind wir an ein Schema gebuden was uns sehr viel Flexibilität kostet. Das hätte ja Layzee weiter oben schon angesprochen.

iPaat commented 8 years ago

Desweiteren hast du auch nicht ganz verstanden was die rewrite Datei macht. Um eine bestimmte news zu lesen ist die GET Variable mit dem Key 'readmore' von nöten. Diese wird von der rewrite Datei gesetzt wenn in der GET['param'] Variable nur eine Zahl steht.

Webmeteor commented 8 years ago

Und somit genauso flexibel oder unflexibel wie meins. Auch bei dir ist man an ein Schema gebunden.

Bei mir, wie auch bei dir, ist nunmal der erste / belegt für das System. An deinem Schema ärgert mich eigentlich nur wieder, dass wir eine Regex Regel drin haben. Und damit können gerade Anfänger wenig anfangen. Sieht nach dem wie in der V9 aus.

Vorteil an deinem Code, man hätte eine Superglobale.

Bei beiden müssen dem Entwickler aber auch Funktionen zur Generierung eines Links zur Verfügung stehen.

iPaat commented 8 years ago

Was mir auch auffällt wenn ich es richtig verstanden habe deine URL wäre:

news/?readmore=1

Finde ich nicht schön und richtig. Für mich ist optimiert = news/1

Webmeteor commented 8 years ago

Eben nicht.

es wäre

readmore/1

Und für die zweite Seite der Newsübersicht

news/2

Was bei dir ja die zweite News wäre?

Am 06.07.2016 um 08:52 schrieb Patrick:

Was mir auch auffällt wenn ich es richtig verstanden habe deine URL wäre:

news/?readmore=1

Finde ich nicht schön und richtig. Für mich ist optimiert = news/1

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/PHP-Fusion-GERMANY/PHP-Fusion/issues/2#issuecomment-230692744, or mute the thread https://github.com/notifications/unsubscribe/AMRmIY2Q8-EZBqBTOaEoLXXdnLD46X45ks5qS1CTgaJpZM4I0F-2.


Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft. https://www.avast.com/antivirus

iPaat commented 8 years ago

Müssen bei dir nicht alle Dateien im selben Ordner sein? und wenn ich eine URL habe:

thread/1/post/1 dann muss ich nicht thread.php sondern post.php aufrufen. Geht bei dir auch nicht. Weiter stehen bei dir keine Variablen per GET zur Verfügung. Ohne RegEx arbeitet man nach Vermutung und das kann in die Hose gehen.

globeFrEak commented 8 years ago

Ich habe anhand von @SuNflOw1991's ersten Codezeilen ein paar Änderungen vorgenommen das der zweite Parameter ($params) auch ein array sein kann. Damit bekommen wir viel mehr flexibilität.

Hier meine Version des rewrite file für die news

if (!defined("IN_FUSION")) {
    die("Access Denied");
}

$rules = array(
    'numbers' => '#^([0-9]+)$#'    
);

if (isset($_GET['params'])) {
    $params = explode('/', $_GET['params']);
    // URL: BASEDIR/news/1
    // URL könnte auch BASEDIR/news/1/news_titel lauten 
    //denn der dritte Paramater spielt hier keine Rollen für die rewrite
    if (preg_match($rules['numbers'], $params[0], $matches)) {
        $query = "?readmore=" . $matches[0];
    }
    // URL: BASEDIR/news/row/1
    if (preg_match($rules['numbers'], $params[1], $matches) && $params[0] === 'row') {
        $query = "?rowstart=" . $matches[0];
    }
    // Load site with GET parameters
    header("Location: " . $settings['siteurl'] . "news.php" . $query);
}else{
    header("Location: " . $settings['siteurl'] . "index.php");
}

Desweiteren würde ich den $rules() array so gestalten das wir alle denkbaren Möglichkeiten von $_GET Zeichen vordefinieren und dem User quasi eine Hilfe geben. Bsp:

$rules = array(
    'numbers' => '#^([0-9]+)$#',
    'letters' => '#^([0-9]+)$#',
'numletters' => '#^([0-9]+)$#',
'A-Za-z0-9_-' => '#^([0-9]+)$#', 
....   
);

Dann als nächstes würde ich schon wie von @Webmeteor eine globale Funktion bereitstellen mit deren Hilfe die Links geparst werden können. Dazu denke ich an eine Funktion die ebenfalls mithilfe der rewrite files arbeitet, nur umgekehrt.

parseLink($keyword,$params){...}
//$params ist ein Array!
//$settings['seo'] Settings zum ein und ausschalten
if($settings['seo'] == TRUE){
return "BASEDIR/news/1"; 
}else{
return "BASEDIR/news.php?readmore=1";
}

Und wenn wir dann so eine globale Funktion haben, dann können wir auch "einfach" ein Fallback einbauen - sofern keine .htaccess (lighttpd) oder mod_rewrite aktiviert werden kann?!

iPaat commented 8 years ago

Vielen Dank für deine Mühe :+1:

Zum einen ist mir aufgefallen dass du ein Redirect machst. Was wir brauchen ist ein Include der benötigten Datei und die Parameter als GET Variable.

Was du mit den Rules gemacht hast ist okay, kann man machen.

Zur globalen Funktion sage ich, wenn es unbedingt sein muss...

globeFrEak commented 8 years ago

Den redirect habe ich gemacht weil es mit einem include nicht geht (da läuft eine Schleife bis zum Memory Overflow)?! Ich weis auch nicht woran das liegt :confused:

Webmeteor commented 8 years ago

Am Basedir, er kann die Datei nicht finden, denke ich.

Am 06.07.2016 um 19:03 schrieb Philipp Horna:

Den redirect habe ich gemacht weil es mit einem include nicht geht (da läuft eine Schleife bis zum Memory Overflow)?! Ich weis auch nicht woran das liegt 😕

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/PHP-Fusion-GERMANY/PHP-Fusion/issues/2#issuecomment-230838097, or mute the thread https://github.com/notifications/unsubscribe/AMRmIYcOLxdy0wOiCqYX-bC3-nzQ7Jyhks5qS9_0gaJpZM4I0F-2.


Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft. https://www.avast.com/antivirus

globeFrEak commented 8 years ago

Ich schau nochmal.

Nur nochmal zum Verständnis, warum ist ein Redirect schlechter? Damit kann ich auch alle Parameter übergeben, oder gibt es da einen Sicherheits Aspekt?

iPaat commented 8 years ago

Redirect macht SEO überflüssig. Warum sollte ich alles auf /news/1 umbauen wenn ich eh wieder bei news.php?readmore=1 lande?

globeFrEak commented 8 years ago

OK, stimmt Naja dann müsst ihr mal drüber schauen - mit INCLUDE landet man nur auf einer weißen Seite. Ich vermute das der BASEDIR nicht richtig greift :question:

Dann ist mir noch aufgefallen, das wir so ja gar keine textanker #, wie sie bei den Kommentaren verwendet werden, nutzen können?!

https://github.com/globeFrEak/PHP-Fusion/tree/Feature/SEF_Links

if (!defined("IN_FUSION")) {
    die("Access Denied");
}

$rules = array(
    'numbers' => '#^([0-9]+)$#'
);
//
// Rewrite rule for Link translation
//
if (isset($_GET['params'])) {
    $params = explode('/', $_GET['params']);
    // URL: BASDIR/news/1
    if (preg_match($rules['numbers'], $params[0], $matches)) {
        $query = "?readmore=" . $matches[0];
        $_GET['readmore'] = $matches[0];        
    }
    // URL: BASDIR/news/row/1
    if (preg_match($rules['numbers'], $params[1], $matches) && $params[0] === 'row') {
        $query = "?rowstart=" . $matches[0];
        $_GET['rowstart'] = $matches[0];        
    } 
    include_once BASEDIR."news.php";
}
//
// Rewrite rules for Link creation
// 
// - array key name based on rewrite rule file name!!!
// - key for rule are the first GET parameter from url
// - value are the SEF/SEO url fragment 
//
if (array_key_exists("news", $rewriteRules) === FALSE) {
    $rewriteRules["news"] = array(
        "readmore" => "news/",
        "rowstart" => "news/row/"
    );
}
iPaat commented 8 years ago

Ich finde die Votes etwas dürftig. Vielleicht warten wir noch eine Woche bis die anderen Entwickler sich auch eine Meinung gebildet haben.


@globeFrEak ich glaube auch das BASEDIR nicht mehr richtig definiert wird. Vielleicht finden wir ja einen anderen Weg BASEDIR zu bestimmen.

globeFrEak commented 8 years ago

@SuNflOw1991, ja daran liegt es.

Alle definierten Pfade(BASEDIR, THEMES, ...) sind unbrauchbar wenn wir eine rewrite URL nutzen. Wir bräuchten eine BASEDIR Definition die das reale Ordner level ohne rewrite Pfad bestimmt. BSP:

localhost/news.php ->BASEDIR = "" localhost/news/1 -> BASEDIR = "../" localhost/news/row/1 -> BASEDIR = "../../" localhost/infusion1/cat/3 -> BASEDIR = "../../../"

iPaat commented 8 years ago

Was ist wenn wir __DIR__ benutzen? Ich kann das leider nicht testen. Am Montag kann ich dazu mehr sagen.

Rauszufinden wäre was __DIR__ in news.php und in einem Unterordner zurück gibt wenn man es in die maincore.php schreibt.

globeFrEak commented 8 years ago

Ja schau ich mir nochmal an. Ich werde aber diese Woche bis einschließlich Samstag nicht groß dazu kommen. :disappointed:

globeFrEak commented 8 years ago

Das müsst ihr euch mal angucken - ich bekomme das einfach nicht hin mit XAMPP unter Windows und __DIR__

Not allowed to load local resource: file:///C:/xampp/htdocs/github/PHP-Fusion/themes/Gillette/styles.css

iPaat commented 8 years ago

Ich habe mich heute damit beschäftigt. So sollte es gehen:

/maincore.php unter require_once BASEDIR."config.php"; ergänzen:

$siteurl = getCurrentURL();
$url = parse_url($siteurl);

$domain = $url['scheme']."://".$url['host'].(isset($url['port']) && $url['port'] != 80 ? ":".$url['port'] : "");
if($url['path'] != "") {
    $parts = explode("/", rtrim($url['path'], "/"));
    $url_ = implode("/", $parts)."/index.php";
    $c = 0;
    while(!file_exists($_SERVER['DOCUMENT_ROOT'].$url_)) {
        if($c > 5) break;
        array_pop($parts);
        $url_ = implode("/", $parts)."/index.php";
        $c++;
    }

    $domain .= implode("/", $parts);
}

define('DOMAIN', $domain."/");
define('FUSION_URL', str_replace($domain."/", "", $siteurl));
define("REL_PATH", getRelativePath(FUSION_URL, ""));

var_dump(DOMAIN, FUSION_URL, REL_PATH);

/maincore.php i.wo unten ergänzen:

function getCurrentURL() {
    $s = empty($_SERVER["HTTPS"]) ? "" : ($_SERVER["HTTPS"] == "on") ? "s" : "";
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/") . $s;
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":" . $_SERVER["SERVER_PORT"]);
    return $protocol . "://" . $_SERVER['SERVER_NAME'] . $port . (str_replace(basename(cleanurl($_SERVER['PHP_SELF'])), "", $_SERVER['REQUEST_URI']));
}

function getRelativePath($from, $to) {
    // some compatibility fixes for Windows paths
    $from = is_dir($from) ? rtrim($from, '\/') . '/' : $from;
    $to   = is_dir($to)   ? rtrim($to, '\/') . '/'   : $to;
    $from = str_replace('\\', '/', $from);
    $to   = str_replace('\\', '/', $to);

    $from     = explode('/', $from);
    $to       = explode('/', $to);
    $relPath  = $to;

    foreach($from as $depth => $dir) {
        // find first non-matching dir
        if($dir === $to[$depth]) {
            // ignore this directory
            array_shift($relPath);
        } else {
            // get number of remaining dirs to $from
            $remaining = count($from) - $depth;
            if($remaining > 1) {
                // add traversals up to first matching dir
                $padLength = (count($relPath) + $remaining - 1) * -1;
                $relPath = array_pad($relPath, $padLength, '..');
                break;
            } else {
                $relPath[0] = './' . $relPath[0];
            }
        }
    }
    return implode('/', $relPath);
}

function strleft($s1, $s2) {
    return substr($s1, 0, strpos($s1, $s2));
}

/.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([a-zA-Z_0-9\-]+)$ ./index.php?key=$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([a-zA-Z_0-9\-]+)/(.*)$ ./index.php?key=$1&params=$2 [L]
</IfModule>

Jetzt muss man nur noch für alle Ressourcen die per URL geladen werden müssen (images, CSS, JS, files, links) die neue Konstante REL_PATH verwenden.

Zum Beispiel: /themes/templates/header.php Zeile: 62

echo "<link rel='stylesheet' href='".REL_PATH.THEME."styles.css' type='text/css' media='screen' />\n";

Das funktioniert so lange wie die /maincore.php in der /index.php geladen wird. Weil dann nämlich BASEDIR immer leer ist. Dies bedeutet wir müssen sicherstellen das wenn die /maincore.php eingebunden wird immer ein require_once verwendet wird. Zu weiteren Tests bin ich nicht gekommen.


Update 1:

Ich habe jetzt die /includes/rewrite/news.php Datei etwas modifiziert.

<?php
if (!defined("IN_FUSION"))
    die("Access Denied");

if (!isset($settings))
    $settings['newsperpage'] = 10;

$rules = array(
    'readmore'      => '#^([0-9]+)$#',
    'page'          => '#^page-([0-9]+)$#',
    'readmore_page' => '#^([0-9]+)/page-([0-9]+)$#'
);

if (isset($_GET['params'])) {
    if (preg_match($rules['readmore'], $_GET['params'], $matches)) {
        $_GET['readmore'] = $matches[0];
    } elseif (preg_match($rules['page'], $_GET['params'], $matches)) {
        $rowstart = 0;
        if ($matches[1] - 1 >= 0)
            $rowstart = ($matches[1] - 1) * $settings['newsperpage'];

        $_GET['rowstart'] = $rowstart;
    } elseif (preg_match($rules['readmore_page'], $_GET['params'], $matches)) {
        $_GET['readmore'] = $matches[1];
        $rowstart         = 0;
        if ($matches[2] - 1 >= 0)
            $rowstart = ($matches[2] - 1);

        $_GET['rowstart'] = $rowstart;
    }
}

include_once BASEDIR.'news.php';

Nun sind folgende Links möglich:

URL Bedeutung
news News Übersicht
news/page-2 In der Übersicht Seite 2 Anzeigen. (rowstart = (page - 1) * items_per_page)
news/1 News mit der ID 1 ansehen
news/1/page-2 Die 2. Seite der News mit der ID 1 ansehen. (rowstart = (page -1))
globeFrEak commented 8 years ago

Also damit geht es bei mir auch nicht :disappointed: https://github.com/globeFrEak/PHP-Fusion/tree/Feature/SEF_Links_second Ich habe dir mal Schreibrechte gegeben in meinem Repo.

iPaat commented 8 years ago

Kann ich nicht nachvollziehen.

Kannst du dein Setup, den Fehler und auch den Output von var_dump(DOMAIN, FUSION_URL, REL_PATH); posten?

Ansonsten wäre noch der <head> Bereich der Seite hilfreich falls sie zwar geladen wird, aber zum Beispiel Styles etc. Probleme machen.

Wie ich auch sehe muss deine Zeile: https://github.com/globeFrEak/PHP-Fusion/blob/Feature/SEF_Links_second/themes/templates/header.php#L62 so heißen:

echo "<link rel='stylesheet' href='".REL_PATH.THEME."styles.css' type='text/css' media='screen' />\n";
globeFrEak commented 8 years ago

Was meinst du mit Setup? Ich verwende zum testen einen XAMPP (Win) PHP Version 5.6.21 mysql 5.0.11-dev

Fehler: wenn ich diese URL aufrufe

http://localhost/github/PHP-Fusion/news

wird mir nur eine weiße leere Seite mit dem var_dump ausgegeben (keine HTML Seite)

string(35) "http://localhost/github/PHP-Fusion/" string(4) "news" string(2) "./"

Was ich selbst schon getestet/probiert habe:

iPaat commented 8 years ago

Kannst du dich die Error Logs ansehen? Dort müsste der Fehler stehen.

globeFrEak commented 8 years ago

Error log ist leer

iPaat commented 8 years ago

Ich meine die von Apache nicht von Fusion selber. Kannst du in der maincore beginnend immer alle 50 Zeilen ein Echo versuchen bis es nicht mehr geht?

In folgender Reihenfolge: maincore > index.php > includes/rewrite/news.php > news.php Vielleicht können wir so den Bereich eingrenzen. Leider habe ich derzeit keinen Rechner an dem ich das selber testen könnte.

globeFrEak commented 8 years ago

Ich meinte auch die von Logs von Apache. maincore.php echos werden bis zum Schluß ausgegeben!

Der Fehler liegt definitiv beim laden der "news.php" in der rewrite Datei! folgendes Beispiel funktioniert (bis zu dieser URL http://localhost/github/PHP-Fusion/news/1/1/1/1/1)

require_once './news.php';

Dann müssen wir alle Bilder mit REL_PATH versehen, im Anhang ein Bild wo ich die CAT Images schon angepasst habe

2016-07-23 12_16_35-php-fusion powered website - news

$news_cat_image .= "<img src='".REL_PATH.IMAGES_N_T.$data['news_image_t2']."' alt='".$data['news_subject']."' class='news-category' /></a>";

Links müssen dann auch alle angepasst werden!

http://localhost/github/PHP-Fusion/news/1/1/1/1/submit.php?stype=n

globeFrEak commented 8 years ago

PUSH

Webmeteor commented 7 years ago

Das ist alles genauso ein schwachsinn, wie in der V9. Schaut euch mal mein bisschen Code an, und dann den Codeoverflow, den ihr da produziert. Und das ja nicht nur für die News, nein das muss ja überall rein! OH, OH

globeFrEak commented 7 years ago

Da gebe ich dir Recht, das ist echt 💩. Also wie machen wir es denn nun?

iPaat commented 7 years ago

Okay, wenn mein Vorschlag so scheiße ist, dann macht mal einen neuen.
Der von @Webmeteor ist ja wohl nicht das optimale. Vernünftige $_GET Parameter halte ich immer noch für SEHR wichtig! Im Gegensatz zu $param[1], $param[2] wo am Ende keiner mehr weiß, was wo steht und wo links und rechts ist.