File structuur:
htdocs/mvcstruct/
- app/
- public/
- | css/
- | img/
- | js/
- |.htacces
- |index.php

Inhoud .htaccess:
<IfModule mod_rewrite.c>
Options -Multiviews
RewriteEngine On
RewriteBase /mvcstruct/public
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

Request URL: http://localhost:3000/mvcstruct/
Output:
Index of /mvcstruct
Parent Directory
app/
public/
OK, dat is volgens verwachting.

Request URL: http://localhost:3000/mvcstruct/public/
Output:
Hello World
OK, dat staat in index.php, prima.

Request URL: http://localhost:3000/mvcstruct/public/test.php
Output:
Not Found
The requested URL /mvcstruct/public/test.php was not found on this server.
Dit verwacht ik niet, wat doe ik verkeerd?
De file test.php zit niet in de map public; ik verwacht uitvoering van de RewriteRule en derhalve uitvoeren van index.php.
Wat doe ik verkeerd cq onvoldoende dan wel te veel?
Wat staat er in je index.php? Is dit Apache die de 404 geeft, of misschien de afhandeling in je index.php?
Wat ik al zei:
OK, dat staat in index.php, prima.
Enkel een echo? Of doe je daar nog iets met routing?
Behalve "Hello World", verder helemaal niks.


[size=xsmall]Toevoeging op 07/10/2021 18:54:28:[/size]

Zet ik een file 'test.php' in de map public en dan
Request URL: http://localhost:3000/mvcstruct/public/test.php
Dan gaat ie braaf naar test.php
Wat te verwachten is want nu werken de 'RewriteCond' condities.
Jan Kila op 07/10/2021 16:00:07

File structuur:
htdocs/mvcstruct/
- app/
- public/
- | css/
- | img/
- | js/
- |.htacces <----- VERKEERD GESPELD
- |index.php



Dat is wel de meest lullige, vandaag.
Niettemin: dank!

Inmiddels componeerde is een .htaccess, met die 's', die de .htaccess files in /app en /public overbodig maakt. Nu alleen nog deze .htaccess in de site_root:
<files config.ini>
order allow,deny
deny from all
</files>
RewriteEngine On
Options -Indexes
Options +FollowSymLinks
RewriteBase /mvcstruct
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ public/index.php?url=$1 [NC,L,QSA]
ik zou het stukje "?url=$1" achterwege laten, net als QSA.

in index.php heb je toegang tot de url die in de browser getoond wordt via $_SERVER.
In mijn beleving is dat duidelijker.

Misschien ook wel, omdat ik geen urls gebruik met "/foo/test.php", maar iets als https://example.com/foo/test

Via een simpele explode() zou je die url al op kunnen delen in losse elementen en daar je ding mee doen. Zonder er rekening mee te hoeven houden dat iemand zelf al een ?url=xyz opneemt in de aanroep, en dat een deel van de inhoud ook nog url_decoded() nodig kan hebben.
@Ivo,
ik zou het stukje "?url=$1" achterwege laten, net als QSA.

Ik wil van die hele .htaccess af, als dat kan.

M'n belangrijkste argument is efficiëntie. Met .htaccess schijnt het zo te zijn dat de server de gehele kerstboom van alle mappen met alle bestanden door fietst; en dat bij elke aanroep van de request URL doet. Dat lijkt me vrij inefficient; de computer is snel zat maar toch alle beetjes helpen.

in index.php heb je toegang tot de url

Niet alleen daar, maar in alle documenten die middels "require once" doorgeeft.

Misschien ook wel, omdat ik geen urls gebruik met "/foo/test.php", maar iets als https://example.com/foo/test

Ja, en dan via de Router doorsluizen naar het document dat je wilt genereren.

Als ik altijd en overal voortdurend, dus heel erg betrouwbaar, middels $_SERVER['REQUEST_URI'] de requested resource location inclusief de query string kan oppikken, dan is dat prima. Dat scheelt in elk geval het telkens opnieuw uitvoeren van .htaccess.



[size=xsmall]Toevoeging op 08/10/2021 15:00:11:[/size]

Een snelle test leert dat die .htaccess blijkbaar een noodzakelijk kwaad is.

Een Request URL als: "http://localhost:3000/mvcstruct/banaan" levert op:
"
Not Found
The requested URL /mvcstruct/banaan was not found on this server.
"
Ik wil dat een dergelijke URL altijd een vertaling ondergaat naar:" http://localhost:3000/mvcstruct/index.php";
Of wat hetzelfde is naar: "http://localhost:3000/mvcstruct/public/index.php" wanneer je wilt dat de rerouting naar een index.php in een map van de bestandsstructuur gaat.

Daarnaast wil ik een boodschap als:
"
Index of /mvcstruct
Parent Directory
app/
public/
"
nooit verschijnt.
En dat lukt voorzover mij bekend alleen met .htaccess

Voor een andere oplossing houd ik me aanbevolen.
Een 'kerstboom' aan een hoop regels in .htaccess vermijd je gelukkig nu ook. Nu stuur je alles door naar index.php waarbij je bestaande bestanden en directories negeert. Zelfs bijna alle frameworks doen dit truukje, en dan kan je er wel vanuit gaan dat het efficiënt zal zijn.

Een directory-listing tegengaan moet je sowieso met .htaccess doen, of nog beter: Op server-niveau configureren.
@Arien,
Ik zei dat net iets anders:
Met .htaccess schijnt het zo te zijn dat de server de gehele kerstboom van alle mappen met alle bestanden door fietst; en dat bij elke aanroep van de request URL doet.

Zo'n MVC-applicatie heeft al snel een 'kerstboom' aan bestanden; en daar moet .htaccess telkens en telkens weer opnieuw bij elke request doorheen ploegen.
Tenminste, als ik het goed heb begrepen; correct me if I'm wrong, please.

Reageren