Apache: valami.php/ hogyan kezelhető normálisan?

 ( kumgabor | 2014. szeptember 3., szerda - 18:35 )

Sziasztok!

Akadt egy olyan problémám az egyik webszerveremen (Debian+Apache), hogy ha a látogató egy tetszőleges PHP fájlnál

http://valami.hu/oldal.php

helyett

http://valami.hu/oldal.php/

ír be, akkor is betölti az oldal.php-t. Ilyenkor a relatív linkek miatt sok minden nem működik, ezért azt szeretném, hogy vagy automatikusan dobja át a / jel nélküli címre, vagy kapjon 404-et.
Hogyan tudom ezt globálisan megoldani? Tipp? Ötlet?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.


if (substr($_SERVER["REQUEST_URI"],-1) === "/"){
header("Location: ".substr($_SERVER["REQUEST_URI"],0,-1));
exit();
}

De az igazi megoldást a mod_rewrite használata jelenti, és a közös belépési pont.

A fenti PHP-s megoldással az a gond, hogy minden fájlba be kellene tenni. A mod_rewrite pedig tudtommal csak azokban az esetekben működik, ha fizikailag nincs ott a fájl. Most pedig ott van.

--
Kum G.
Linux pólók HUP pólók Debian tanga

Ezért írtam a közös belépési pontot, minden kérés egy fájlhoz fusson be, és onnan eldöntheted hogy mit futtatsz le (routing). Vagy beírod ezt egy php fájlba és mindenhová beincludeolod.
A mod_rewrite-nál a "RewriteCond %{REQUEST_FILENAME} !-f" vizsgálja a fájl létezését, ha ezt a sort kihagyod, akkor minden fájlra teljesül a RewriteRule. Ugyanígy lehet olyan condition-t írni, hogy csak a php-ra vonatkozzon.

+1
nézz meg egy mediawikit, ott is minden az index.php-ból indul ki
index.php/valami_aloldal
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/

+ ezt kiegészítve egy megfelelő mod_rewrite-ál használhatod a sokkal szebb domain.tld/valami_aloldal/valami funkcio linkeket, a háttérben mind átfordítva index.php-ra és majd ott lekezeled, milyen URL-re mi is történjen.

+1, és még egy észrevétel arra, hogy "minden file elejére be kéne rakni", ha ezzel újat mondok esetleg, célszerű valami minden file által includeolt közös filet csinálni, ennek ezen a redirect megoldási lehetőségen kívül ezer fontosabb oka is van (logolás, autoinclude, adatbázis, includeok, konstansok, stb.)

Köszönöm, úgy tűnik ez lesz a jó megoldás.

--
Kum G.
Linux pólók HUP pólók Debian tanga

Egy alternatív megoldás: "AcceptPathInfo off". Ugyanitt láthatod, hogy ha be van kapcsolva, akkor a PATH_INFO környezeti változóval le tudod kezelni PHP oldalról is. Normális keretrendszerekben pl. így működik. Magánvéleményem szerint, aki kézzel gépel be URL-t, ne lepődjön meg, ha hibakódot kap rá, ugyanakkor értelmes helyeken még jobb, ha "szép" URL-eket használsz, és rewrite-tal kezeled az összes URL-t.

--

Üdv,

nálam ez megoldja:

.htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

php-ben pedig $_SERVER["REQUEST_URI"] -ból döntöm el hogy mi volt az eredeti query

KoviX

+1 a RewriteEngine irányba, nekem is bevált.

Sakk-matt,
KaTT :)

Próbálnám elkerülni, hogy minden egyes URL-t egy fájl szolgáljon ki, de ahogy nézem ez lesz belőle.

--
Kum G.
Linux pólók HUP pólók Debian tanga

Nem a fájl szolgálja ki, ő csak továbbítja a "kéréseket".
Nem hülyeség ez, ha jól oldod meg: a (jelenlegi) index.php fájlod az uri alapján osztja ki a munkát különböző osztályoknak (MVC-ben a controllereknek).
http://www.janoszen.com/2013/01/08/writing-modern-day-php-applications/

Értem én, használom is, de csak nem létező fájlok esetén. Attól idegenkedek, hogy minden fájlra ez menjen.

--
Kum G.
Linux pólók HUP pólók Debian tanga