.htacces vraag
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?
Quote:
OK, dat staat in index.php, prima.
Enkel een echo? Of doe je daar nog iets met routing?
Toevoeging op 07/10/2021 18:54:28:
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
htdocs/mvcstruct/
- app/
- public/
- | css/
- | img/
- | js/
- |.htacces <----- VERKEERD GESPELD
- |index.php
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:
Quote:
<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]
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]
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.
Quote:
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.
Quote:
in index.php heb je toegang tot de url
Niet alleen daar, maar in alle documenten die middels "require once" doorgeeft.
Quote:
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.
Toevoeging op 08/10/2021 15:00:11:
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 directory-listing tegengaan moet je sowieso met .htaccess doen, of nog beter: Op server-niveau configureren.
Ik zei dat net iets anders:
Quote:
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.
Enige wat .htaccess doet is een soort doorsturen.
Maar ik meen juist dat andere te hebben gelezen; en dat is niet gemakkelijk te begrijpen; en het kan ook zijn dat degene die het schreef, het ook niet goed wist.
En ja, het gaat in elk geval in de routing van de applicatie.
En ja, óók .htaccess moet zo'n werk doen, iedere keer opnieuw.
Iemand die er voor heeft gestudeerd mag het zeggen. Vooralsnog houd ik me bij .htaccess want ik weet niet beter.
Er is ook geen ander alternatief, je wilt immers alles requests doorsturen naar index.php, en dat gebeurt ook. Heb je een link naar dat artikel?
Als het je eigen server is, en je kunt in de httpd.conf file editen (of conf/extra/httpd-vhosts.conf, of hoe het op jouw server ook ingestoken is), dan heeft dat verreweg de voorkeur.
Zie ook: https://httpd.apache.org/docs/2.4/howto/htaccess.html
En dan kan het voorkomen dat je in documentroot een .htaccess hebt, maar ook in /documentroot/scripts en in /documentroot/scripts/inloggen en in /documentroot/scripts/inloggen/queries/
en dan zal apache elk van die mappen de .htaccess gebruiken.
Maar nu heb je een andere situatie met maar 1 .htacces file. (in de documentroot).
En die doet niets als de file bestaat
en bestaat het path niet, dan wordt index.php aangesproken.
Dat is minimaal werk. En ook de enige manier om dit op te pakken
Nee, ik heb geen artikel; het is ook al vrij lang geleden dat ik dit heb gelezen.
@Rob,
Het is een remote host, daar mag ik met m'n vingers vanaf blijven.
Toevoeging op 08/10/2021 22:38:03:
@Ivo,
Je stelt me gerust, dank!