rewriterule probleem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Java Front-end Developer

Dit ga je doen Ontwikkelen van nieuwe functionaliteiten in Java met tools als Springboot, MS SQL Server (T-SQL) en JavaScript; Het onderhouden van de (web-)applicaties binnen een complexe omgeving; Werken aan de migratie van een monolithisch systeem naar een architectuur gebaseerd op Kubernetes; Code reviews met collega's en actieve kennisuitdelingsessies voeren; Het uitvoeren van unit- en systeemtests Experimenteren met nieuwe tools en technieken. Hier ga je werken Binnen deze organisatie kom je te werken op de afdeling die gegevens verzamelt vanuit het hele land. Denk hierbij aan vertrouwelijke persoonsgegevens. Het team verwerkt al deze data met als doel het waarborgen

Bekijk vacature »

Java Developer

Vacature details Vakgebied: Software/IT Opleiding: Senior Werklocatie: Eindhoven Vacature ID: 12946 Introductie We are looking for a Java Developer! Our client is one of the most innovation companies located within the Netherlands. We provide high quality software in a high-tech and challenging market. Functieomschrijving The department is specialized in creating and developing high quality software for manufacturing automation in a high tech environment. We strive to provide our clients with high quality software and deliver state of the art solutions in a variety of ways. Creating software infrastructure using Java SE / EE Create applications to fine tune manufacturing processes

Bekijk vacature »

Medior Java developer

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

.NET Developer

Dit ga je doen Tot jouw takenpakket behoort onder andere: Webapplicaties ontwerpen, bouwen, testen en implementeren in .NET/C#.; Ontwikkelen, implementeren en beheren van maatwerkapplicaties; Onderhouden en beheren van standaardpakketten; Onderzoeken en beoordelen van nieuwe technieken. Hier ga je werken Als .NET ontwikkelaar kom je te werken bij een grote semioverheidsinstelling in Nijmegen. De organisatie staat garant voor het leveren van onderwijs en les- en onderzoeksmateriaal voor duizenden betrokkenen. De organisatie wil bijdragen aan een gezonde, vrije wereld met gelijke kansen voor iedereen. Binnen de teams hangt een open en collegiale cultuur met veel aandacht voor een prettige en sociale werksfeer.

Bekijk vacature »

Software Programmeur PHP

Functie Ben jij op zoek naar een nieuwe uitdaging als PHP developer en zoek je een leuke platte organisatie? Lees dan snel verder! Voor een opdrachtgever in omgeving Capelle aan den IJssel dat zich gespecialiseerd heeft in het realiseren van veilige netwerkverbindingen zijn wij op zoek naar een leuke software developer ter versterking van het huidige team. Hoe kan jouw dag er straks uitzien? Je gaat software en webapplicaties ontwikkelen met behulp van de talen PHP, JAVA en Node.js. Je gaat technische klussen uitvoeren op locatie bij klanten. Je onderhoudt contact met de projectleider om er zeker van te zijn

Bekijk vacature »

JAVA Programmeur

Bedrijfsomschrijving Functieomschrijving We zoeken per direct enthousiaste software engineers die ons team komen versterken.We werken in DevOps teams met een sterk gevoel voor verantwoordelijkheid. Er wordt nauw samengewerkt met ons Business analyse team (BAT), met onze uitvoerende medewerkers en met de DevOps teams onderling binnen het domein. Het liefst hebben we veel en vaak interactie met onze interne en externe eindgebruikers om zo de juiste dingen te maken. We werken multidisciplinair in een dynamische omgeving. Achtergrond opdracht De Businesseenheid Examens is verantwoordelijk voor de logistiek van de staatsexamens Voortgezet (speciaal) onderwijs, Nederlands als 2e taal en schoolexamens. In het kader

Bekijk vacature »

Frontend Developer - Leeuwarden

Frontend Developer – Leeuwarden Als Frontend Developer bouw jij mee aan het onderwijs van de toekomst! In een scrum team werken met jonge en enthousiaste collega’s, moderne technieken, ruimte voor eigen ontwikkeling en op een proactieve wijze kunnen meewerken aan innovatie binnen het onderwijs. Magister is het state-of-the-art softwarepakket dat scholen in het voortgezet onderwijs op alle fronten ontzorgt. Van leerlingenadministratie tot het ondersteunen van individuele leerlijnen, van toegang tot digitaal lesmateriaal tot het plannen van het lesrooster. In de Magister app bedient Magister ruim 2,5 miljoen gebruikers waarvan, dagelijks meer dan 600.000 unieke. Hiermee is Magister de absolute marktleider

Bekijk vacature »

C# developer

Functie Als ervaren Software Engineer wordt jij verantwoordelijk voor het bedenken en ontwikkelen van technische (maatwerk) oplossingen voor onze klanten en dit samen met de klant af te stemmen. Jij wordt o.a. verantwoordelijk voor de doorontwikkeling het software pakket welke voor ons enorm belangrijk is. Dit pakket zorgt er namelijk voor dat wij complete productielijnen kunnen aansturen en monitoren. Daarnaast heb jij actief contact met onze hoofdvestiging om het software achter een van onze systemen te verbeteren en te herschrijven. Momenteel zijn onze C# applicaties geschreven met o.a. Winforms. Echter hebben wij de actieve ambitie om dit te gaan herschrijven

Bekijk vacature »

Senior PHP developer

Functie Als Senior PHP developer heb je een sterke mening over de architectuur van projecten en de processen binnen het team. Je bent de sparringpartner voor je Team Lead. Ook ondersteun je met jouw kennis de minder ervaren developers in jouw team. Ze werken regelmatig aan projecten vanaf scratch en dit geeft ruimte om voor nieuwe technieken te kiezen. Naast het ontwikkelen van software ben je continue bezig om ook jezelf te ontwikkelen. Ze werken met o.a.: PHP, Laravel, Doctrine, PHP Unit, Behat, React, TypeScript, (My)SQL, Postgress, Redis, ElasticSearch, Docker, Nginx, GIT flow, JIRA, AWS. Eisen • HBO werk- en

Bekijk vacature »

Team Lead/ Lead developer gezocht (Hands-on, PHP,

Functie Als Team Lead ben je de leider van één van de ontwikkelteams binnen de organisatie. Je leidt als lead developer een goed draaiend team dat werkt aan complexe en duurzame applicaties en API’s. Vanuit je kennis en ervaring ben je in staat het grote plaatje te blijven overzien, en kritisch mee te denken over bijvoorbeeld de architectuur, maar ook de algehele aanpak binnen het project. Je laat je team niet alleen technisch goed functioneren maar ben ook betrokken bij het menselijke aspect. Zo weet jij je collega’s te motiveren en begeleiden in hun dagelijkse werk. Buiten het team ben

Bekijk vacature »

Software Programmeur PHP - JAVA

Functie Voor een opdrachtgever in omgeving Zoetermeer zijn wij op zoek naar een ontwikkelaar ter versterking van het huidige developers team. Heb jij altijd al willen werken voor een bedrijf, dat veilige netwerkverbindingen levert, door middel van veilige oplossingen, die door middel van de nieuwste technologieën ontwikkelt zijn? Stop dan nu met zoeken! Hoe kan jouw dag er straks uitzien? Je gaat software en webapplicaties ontwikkelen met behulp van de talen C / C++ / PHP. Je gaat technische klussen uitvoeren op locatie bij klanten. Je onderhoudt contact met de projectleider om er zeker van te zijn dat een projecten

Bekijk vacature »

IoT Developer

Ben jij innovatief, heb jij passie voor energie en ben je data gedreven? Bouw dan mee aan IoT binnen Bredenoord. Samen met een gedreven team werk jij aan mooie technische en innovatieve oplossingen. Wat houdt de functie van IoT Developer in? Binnen Bredenoord zijn wij momenteel volop in ontwikkeling met ons IoT platform. Als uitbreiding van ons team zijn wij op zoek naar een IoT Developer. Je zal in projectverband meehelpen met het implementeren van IoT vraagstukken binnen Bredenoord. Als IoT Developer op onze R&D-afdeling word je verantwoordelijk voor het verder inrichten en beheren van ons nieuwe IoT platform. Dat

Bekijk vacature »

Mendix Consultant / Developer

Dit ga je doen Het in kaart brengen en analyseren van de functionele wensen van de klant rondom Mendix applicaties; Het fungeren als sparringpartner voor de (interne) klanten; Het opstellen van requirements en het vertalen hiervan naar technische mogelijkheden; Het opstellen van user stories; Het bouwen van de Mendix applicaties in samenwerking met jouw team of zelfstandig; Het testen van op te leveren software en het zorg dragen voor de implementatie; Trainen van gebruikers in het gebruik van de applicatie; Werken in een Agile omgeving. Hier ga je werken De organisatie begeeft zich in de retail branche en focust zich

Bekijk vacature »

Full stack ontwikkelaar Laravel, Vue.js

Functie Als ontwikkelaar binnen deze organisatie hou jij je voornamelijk met lopende projecten voor de verschillende klanten. Zo bouw je de ene dag aan prijsschifting systemen en de andere dag onderzoek je crawlers en stel je ze zo in dat de data goed binnen komt binnen het systeem. Daarnaast bouw je mee aan dashboards en ben je dus constant bezig met het verbeteren van het platform. Er is een vaste werkwijze, zo werken ze met Trello kaarten en onderverdelen ze deze aan het begin van iedere week onder de developers. Dit wordt door de lead developer gedaan, maar in samenspraak

Bekijk vacature »

Medior/Senior Front-end Developers gezocht (Utrech

Functie Het team bestaat uit 10+ gespecialiseerde (veel senior) front-end ontwikkelaars en ontwerpers die werken aan projecten voor klanten van verschillende groottes (kan twee jaar bezig zijn met 1 klant). Je helpt klanten met ingewikkelde front-end vraagstukken, hierbij kun je denken aan: UX/UI design, CI/CD, architectuur en integratie met back-end systemen. De werkzaamheden verricht je op locatie bij de klant, dit is vaak in de Randstad. De organisatiestructuur is plat en er heerst een informele sfeer, zo kun je met vragen dus terecht bij de directie. Er wordt veel nadruk gelegd op het bevorderen van persoonlijke ontwikkeling door middel van

Bekijk vacature »
Tortuga web

tortuga web

10/04/2015 09:18:31
Quote Anchor link
Ik heb een website met in de root een index-file die de diverse pagina´s aanroept:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html lang="nl">
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="css/menu.css" />
    <title>Testsite</title>
    <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
</head>

<body>
<div align="center">
    <div class="head">
        <?php
            session_start();
            include("content/head.php");
            include("content/menu.php");
        ?>

        <div class="basis">
            <?php
                if (!isset($_GET['page'])) {
                    //url-variabele bestaat niet, geef beginpagina
                    include('content/home.php');
                }

                else {
                    //url-variabele bestaat wel, definieer bestand
                    $page = 'content/'.$_GET['page'].'.php';
                    if (file_exists($page)) {
                        //pagina bestaat, laat zien
                        include($page);
                    }

                    else {
                        //pagina bestaat niet
                        echo '<p id="index">Deze pagina bestaat (nog) niet. Kijkt u later nog eens.</p>';
                    }
                }

            ?>

        </div>
    </div>
</div>
</body>
</html>

De pagina´s met de inhoud staan in de submap /content, met enkel de body-inhoud.
Ook het bestand menu.php staat in de submap /content en is als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<ul id="nav">
    <li><a href="index.php?page=home">Home</a></li>
    <li><a href="index.php?page=links">Links</a></li>
</ul>

Dit levert in de adresregel in de browser links met de structuur http://127.0.0.1:8080/test/index.php?page=home.
Dat wil ik graag omzetten naar http://127.0.0.1:8080/test/home, dus heb ik in de root (bij de index.php) een .htaccess bestand toegevoegd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]

RewriteRule ^(.*?)$ $1 [L]
RewriteRule ^(.*?)$ index.php?page=$1 [L,QSA]

Ik heb dit getest met de Wamp-server én gecontroleerd dat rewrite-module aan staat en ja, die staat aan.

Waarom werkt dit niet?
 
PHP hulp

PHP hulp

26/04/2024 23:45:29
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 09:27:28
Quote Anchor link
Je RewriteBase zal in ieder geval /test/ moeten zijn denk ik.

Verder snap ik niet dat iedereen altijd een volledig pad in een querystring wil opslaan... Hiermee reserveer (lees: verspil) je effectief een querystring-variabele voor dit doel. Wat nu als je $_GET['page'] later wilt gebruiken voor een pagina-navigatie, dit kan dan niet meer.

Ik zal eens een voorbeeldje maken, maar mogelijk is het na de aanpassing van je RewriteBase al opgelost.
 
Tortuga web

tortuga web

10/04/2015 09:30:18
Quote Anchor link
Ook met RewriteBase /test/ blijft het onveranderd. Ik ben benieuwd naar je voorbeeldje.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 10:27:57
Quote Anchor link
Het duurde ff, maar dan heb je ook wat :).

Mijn opzet: code staat in http://localhost/test/rewriterules.

.htaccess in deze map:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
RewriteEngine on

# het relatieve pad ten opzichte van de document root van je (virtual) host
RewriteBase /test/rewriterules/

# rechtstreekse aanroep van bestaande directories en bestanden blijft werken
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

# rest van alle aanroepen wordt doorgestuurd naar index.php
# plak hierbij de querystring aan index.php vast
RewriteRule . index.php [L,QSA]


index.php in deze map:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
// Zet bij het ontwikkelingen foutmeldingen aan.
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');

// Sessies starten doe je voor aanvang van je document.
session_start();

// In plaats van eem metatag zou je ook kunnen overwegen om gewoon een PHP-header te gebruiken:
header('Content-Type: text/html; charset=UTF-8');
?>

<!DOCTYPE html>
<html lang="nl">
<head>
    <meta charset="UTF-8" />
    <!-- omdat je in CSS en JavaScript vaak relatieve verwijzingen gebruikt en je URLs vaak niet uit -->
    <!-- echte folders bestaan is het zaak dat je altijd hetzelfde uitgangspunt hanteert voor relatieve -->
    <!-- verwijzingen naar deze documenten, dit doe je met de base tag -->
    <base href="http://localhost/test/rewriterules/">
    <link rel="stylesheet" href="css/menu.css" />
    <title>Testsite</title>
    <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
</head>

<body>
<div align="center">
    <div class="head"><?php
        // Ik zou hier "includes/onderdeel.php" van maken ofzo, om dit te onderscheiden van je content-includes.
        // Ook zou ik hier "require" van maken - het is de bedoeling dat deze bestanden bestaan!

        require './content/head.php';
        require './content/menu.php';
        ?>
<div class="basis"><?php
            // Hier ga je bepalen welke pagina werd aangeroepen. Dit doe je aan de hand van $_SERVER['REQUEST_URI'].
            ?>
<p>Oorspronkelijke aanroep: <?php echo $_SERVER['REQUEST_URI'] ?></p><?php
            // Inspecteer of deze hout snijdt.
            $path = '';
            $uriData = @parse_url($_SERVER['REQUEST_URI']);
            if ($uriData === false) {
                // REQUEST_URI klopte niet, doe hier iets of geef $path een waarde.
            } else {
                ?>
<p>Absoluut pad: <?php echo $uriData['path'] ?></p><?php
                // We zijn alleen maar geinteresseerd in het relatieve pad vanaf de relatieve root
                // oftewel we willen /test/rewriterules/ van $uriData['path'] strippen

                $path = substr($uriData['path'], strlen(dirname($_SERVER['SCRIPT_NAME'])) + 1);
                ?>
<p>Relatief pad: <?php echo $path ?></p><?php
                // Bonus: al je $_GET variabelen kun je vrij gebruiken:
                ?>
<p><pre>$_GET: <?php echo print_r($_GET, true) ?></pre></p><?php
                // Vervolgens kun je $path (mogelijk in combinatie met waarden uit $_GET) gebruiken om
                // wat voor content dan ook te laden...

            }
        ?>
</div>
    </div>
</div>
</body>
</html>


Een aanroep van http://localhost/test/rewriterules/pagina/lalal/hoi?test=1&hoi=2 levert dit op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
Oorspronkelijke aanroep: /test/rewriterules/pagina/lalal/hoi?test=1&hoi=2

Absoluut pad: /test/rewriterules/pagina/lalal/hoi

Relatief pad: pagina/lalal/hoi

$_GET: Array
(
    [test] => 1
    [hoi] => 2
)


EDIT: waar je ook voor moet zorgen is dat je .htaccess bestanden MAG declareren in je webdirectories, dit doe je door in je httpd.conf in de <Directory> tag van je web directory de instelling AllowOverride de waarde All te geven. Als deze op None stond en/of je deze waarde hebt aangepast moet je Apache even herstarten uiteraard.

EDIT:
Als alternatief voor de regel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$path
= substr($uriData['path'], strlen(dirname($_SERVER['SCRIPT_NAME'])) + 1);
?>


Zou je ook deze kunnen gebruiken
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$path
= trim(substr($uriData['path'], strlen(dirname($_SERVER['SCRIPT_NAME']))), '/');
?>

Dit zorgt ervoor dat het niet uitmaakt of je een pagina aanroept met /whatever of /whatever/. Het uiteindelijke relatieve pad wordt dan in beide gevallen "whatever" (zonder trailing of leading slashes).
Gewijzigd op 10/04/2015 11:08:08 door Thomas van den Heuvel
 
Tortuga web

tortuga web

10/04/2015 11:34:24
Quote Anchor link
Ben heel driftig aan het uitproberen geslagen, en het werkt goed om de pagina´s zo aan te roepen, maar in de adresregel verandert er niets.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 11:42:09
Quote Anchor link
Wat bedoel je met "in de adresregel verandert er niets"?

Als je hiermee bedoelt dat als er in je code staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="index.php?page=home">home</a>

Dat dit op een of andere magische wijze wordt omgezet in:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="test/home">home</a>

Dan klopt dit (dat dit niet gebeurt).

Dit is een ander probleem dat je op een andere manier -en op een andere plaats- moet oplossen. Dit heb ik hier al min of meer toegelicht.

Of ik begrijp niet goed wat je bedoelt.
 
Tortuga web

tortuga web

10/04/2015 11:55:44
Quote Anchor link
Dat klopt, daar was ik al achter, maar het moet toch kunnen dat ik m´n pagina´s aanroep via de index.php, zoals met jouw script, en dat de output in de adresregel verschijnt met localhost/test/home.
Als ik de pagina aanroep met: index.php?page=home, dan wordt de pagina inderdaad aangeroepen, en zie ik dit dus in de adresregel. Als ik de pagina aanroep met /home.php of home of whatever ik heb kunnen bedenken, dan wordt die niet geladen.
Dus neem ik aan dat ik iets fout doe met de wijze van aanroepen, maar ik weet niet wat.

NB. Ja, de allowoverride staat op on
Gewijzigd op 10/04/2015 11:58:20 door tortuga web
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 11:59:41
Quote Anchor link
Had je deze edit nog gezien:
Quote:
EDIT: waar je ook voor moet zorgen is dat je .htaccess bestanden MAG declareren in je webdirectories, dit doe je door in je httpd.conf in de <Directory> tag van je web directory de instelling AllowOverride de waarde All te geven. Als deze op None stond en/of je deze waarde hebt aangepast moet je Apache even herstarten uiteraard.

Oftewel: als AllowOverride in je httpd.conf op None staat, dan doen je .htaccess bestanden (en daarmee je RewriteRules) niets.

EDIT: heb je Apache/XAMPP opnieuw gestart na deze wijziging?
Gewijzigd op 10/04/2015 12:01:45 door Thomas van den Heuvel
 
Tortuga web

tortuga web

10/04/2015 12:00:44
Quote Anchor link
Ja, die heb ik dus gecontroleerd en staat All
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 12:04:15
Quote Anchor link
Uhhh...

Hoe ziet je code er op dit moment uit?
Welke URL roep je precies aan?
Wat verwacht je dat er zou moeten gebeuren?
Wat gebeurt er daadwerkelijk?
 
Tortuga web

tortuga web

10/04/2015 17:42:00
Quote Anchor link
Oké, ik zie door de bomen het bos niet meer.
Wat zet ik in de menu-file om de diverse pagina´s aan te roepen?
<a href=""index.php?page=home">Home</a> is dus niet goed? Wat dan wel???
 
Bart V B

Bart V B

10/04/2015 18:40:49
Quote Anchor link
Je urls moet je zelf aanpassen.
Dat gebeurt niet automatisch.
Dus in jou geval een hyperlink ala http://domain.tld/test/home
Heel dat index.php moet aangepast worden.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/04/2015 21:11:11
Quote Anchor link
Voor de duidelijkheid: de index.php die ik hierboven plaatste is niet volledig. Uiteindelijk houd je een schoongemaakt relatief pad over op grond waarvan je moet bepalen welke pagina geladen moet worden...

Dit doe je bijvoorbeeld met een if-elseif-...-else-statement waarbij je $path inspecteert, of je slaat deze unieke slugs op in je database en haal je deze hieruit op.

En in je hyperlinks kun je gewoon je clean URLs gebruiken, zoals je ze wilt aanroepen. Maar als je deze hier hard incodeert, dan veranderen ze dus ook niet mee als je de "slug" aanpast. Hierbij zou een database-oplossing beter zijn, in die zin dat je dingen generieker kunt opzetten. Je houdt de pagina's bijvoorbeeld bij in een "nodes" tabel, en gebruikt voor je interne URL's een functie die met behulp van het node-id de juiste slug (pagina URL) ophaalt. Zo heb je dus een indirecte en centrale manier voor het aanspreken van je pagina's.

Hey, nobody said it would be easy.
 
Tortuga web

tortuga web

10/04/2015 21:27:36
Quote Anchor link
Thomas van den Heuvel op 10/04/2015 21:11:11:
Hey, nobody said it would be easy.


Een waarheid als een koe!!!

Ik ga er weer verder mee stoeien, wellicht kom ik er ooit uit.
Ik snap in ieder geval iets beter wat jullie bedoelen, nou nog zien of ik het ook verwerkt krijg. In ieder geval alvast bedankt voor de hulp.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/04/2015 11:59:15
Quote Anchor link
Ik bedacht me net een variant die ook wel makkelijk werkt: eentje met arrays en wat hulpfuncties. Als je wilt kan ik daar een voorbeeldje van uitwerken van wat het idee is en hoe je deze vervolgens gebruikt.
 
Tortuga web

tortuga web

11/04/2015 12:03:30
Quote Anchor link
Nou, dat zou wel welkom zijn. Als je dat zou willen doen, dan al bij voorbaat veel dank daarvoor.
 
Thomas van den Heuvel

Thomas van den Heuvel

11/04/2015 13:32:14
Quote Anchor link
Okay, allereerst, in zijn algemeenheid kom je bij "clean URLs" voor drie uitdagingen te staan:

1. hoe maak ik deze en krijg ik deze aan de praat
Dit is hierboven wel ongeveer behandeld. In een ander topic refereerde Frank aan een script die slugs kan maken uit titels enzo, die zou ik zeker eens bekijken. Dit is dus de "genereer" kant.

Vervolgens:
2. hoe zorg ik ervoor dat ik deze weer uit kan lezen
Hier waren we nu ongeveer beland, we hebben de REQUEST_URI al helemaal uitgekleed tot het moment dat we de oorspronkelijke "slug" overhielden. Maar hier moet nog iets mee gebeuren anders gebeurt er nog steeds niets :). Hier gaan we zodadelijk mee verder.

En last but certainly not least,
3. hoe houd ik de referenties naar mijn pagina's (de slugs) consistent
Want je wijst nu niet meer direct naar een bron (een fysiek bestand) maar naar een soort van niet-bestaande alias. Wat nu als ik een rubriek op mijn site heb genaamd /news (de slash is even om te verduidelijken dat ik het over een pad heb) en ik heb een aantal plaatsen waar ik hier naar verwijs. Stel nu dat /blog toch toepasselijker was geweest? Dit kan ik verder prima aanpassen, maar hoe zorg ik ervoor dat alle verwijzingen naar /news automatisch meeveranderen naar /blog (nog even los van alle SEO implicaties van zo'n operatie :)). Als je allerlei verwijzingen in je navigatielinks hard-code dan zul je dus een soort van site-wide search-and-replace moeten doen, en daar wil je echt niet aan beginnen (tenzij je Moodle heet (een opensource electronisch leersysteem, DON'T ASK :P)). Maar goed dit probleem moeten we dus ff in ons achterhoofd houden. Eerst naar punt 2.

Het idee
De eerste stap van dit proces is het organiseren van onze data. Wat we willen is een soort van "mapping" van een unieke slug naar een stuk code dat wordt uitgevoerd. Maar hierbij kunnen we er niet vanuit gaan dat de slug niet verandert. Het beste wat we kunnen doen is deze paren nummeren. We krijgen dan bijvoorbeeld de volgende structuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$nodes
= array(
    1 => array(
        'slug'  => '',
        'title' => 'Home',
        'code'  => '/path/to/code/home.php',
    ),

    2 => array(
        'slug'  => 'links',
        'title' => 'Links',
        'code'  => '/path/to/code/links.php',
    ),

    3 => array(
        'slug'  => 'contact',
        'title' => 'Contact',
        'code'  => '/path/to/code/contact.php',
    ),

    // et cetera
);
?>

Dat is fijn, maar we hebben de slug nodig om te bepalen welke code we moeten includen :p.
Dus maken we een reverse-lookup array. Je hebt nu met $nodes een id => slug mapping, en je wilt het omgekeerde: slug => id. Daarom is het ook belangrijk dat slugs uniek zijn en blijven, dit is iets wat je op een of andere manier moet afdwingen. Bij het opstellen van het reverse-lookup array houden we alleen de meest relevante informatie bij (enkel slugs in de keys en id's in de values). Het $nodes array blijft onze enige echte bron van de structuur-data, we gaan niet alles lopen sleuren en pleuren door onze code.

Zorg ook dat slugs geschikt zijn als array-key uiteraard :).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
// build slugs array - MAKE SURE SLUGS REMAIN UNIQUE
$slugs = array();
foreach ($nodes as $id => $data) {
    $slugs[$data['slug']] = $id;
}

?>

Als we hiermee voortborduren op de eerdere code van index.php, dan kunnen we vrij eenvoudig bepalen welke code we moeten includen, voeg de $nodes en $slugs code toe aan je index.php na regel 50 ($path heeft nu een waarde die we moeten inspecteren) en voeg de volgende code toe om te testen of de juiste pagina geladen zou worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// if the path contains an existing slug, we have found an existing "alias"
if (isset($slugs[$path])) {
    // shorthand for node id for readibility
    $nodeId = $slugs[$path];
    // the next bit is merely a check to see what code we would include
    // it still does nothing!
    // to actually do this you would need to include it yourself obviously

    ?>
<h2>Page Found!</h2>
    <p>code: <?php echo $nodes[$nodeId]['code'] ?></p><?php
} else {
    // in this case you would revert to a default node id, which would be 1 in our case
    // you could also choose to load a special error page (404, 500 etc.) and set the
    // appropriate HTTP headers to indicate what is wrong

    $nodeId = 1;
    ?>
<h2>Page not found! Loading default!</h2>
    <p>code: <?php echo $nodes[$nodeId]['code'] ?></p><?php
}
?>

That's it, je kunt nu de juiste code requiren. Het wordt natuurlijk nog spannender als:
- je deze code gaat verplaatsen naar klasses (niet meer inline uitschrijven enzo)
- je je sitestructuur in een database stopt in een soort van boomstructuur
- je index.php een soort van "maintemplate" wordt en de code een soort van "paginatypes" waarbij het paginatype kan communiceren met het maintemplate, bijvoorbeeld vanuit je paginatype stel je een titel in voor het HTML-document in je maintemplate

Dan nog een ILLUSTRATIEVE manier van hoe je links zou moeten maken in je pagina's. Het is heel simpel: je gebruikt hiervoor een functie die aan het node-id refereert. Vervolgens kun je je slug dus vrij aanpassen (zolang deze uniek blijft). Let wel: dit is een VOORBEELD, je kunt de link functie beter ook opnemen in een klasse bij de rest van je "SITE ROUTING", maar goed het volgende werkt ook:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function nodeLink($id) {
    global $nodes; // this is ugly, i know alright!
    if (isset($nodes[$id])) {
        $slug  = $nodes[$id]['slug'];
    }
else {
        $slug = ''; // or "deadlink" or something
    }
    // @todo add HTTPS
    // @todo make relative path configurable
    // @todo add args parameter etc.

    return 'http://'.$_SERVER['HTTP_HOST'].'/test/rewriterules/'.$slug;
}

?>

Vervolgens, als je dus een link naar /contact wil maken doe je dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href="<?php echo nodeLink(3) ?>">test</a>

En als je de slug van deze pagina vervolgens verandert naar "whatever" dan verandert de link automatisch mee! Tadaa~
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.