Yritin siis saada localhostilla .htaccess -tiedoston avulla tehtyä sellaista sydeemiä, että sivu, jonka osoite on "localhost/example/index.php?p=2", muuttuu osoitteeksi "localhost/example/about".
Copypastella värkkäsin, eikä siitä hyvä heilunut, koska en ollut suuremmin tutustunut Direktiiviin :)
Jokin meni vikaan ja kun menin sivulle "localhost/example/index.php?p=2", ohjattiin minut sivulle "localhost/2". Tyhjensin .htaccess -tiedoston, eikä se auttanut. Asensin jopa XAMPPin uudelleen, mutta vika on ja pysyy. Miten se voi olla, vaikka olen poistanut .htaccessin? Ja MITEN palautan asetukset normaaliksi? Kiitos.
Jos htaccess-tiedoston tyhjentäminen ei auta (ja olet yrittänyt sen jälkeen kirjoittaa selaimeen alkuperäisen osoitteen; ei se itsestään hyppää takaisin!), mitä ilmeisimmin vika on jossain muualla eli olet samaan aikaan tehnyt jonkin toisen muutoksen esimerkiksi PHP-koodiisi.
Ei auttanut ei :( En käsittänyt sitä itsekään miksi niin. Nimesin kansion uudelleen, jolloin ongelma poistui, eli luulisin, että jossain on se .htaccess -tiedosto, mutta ei ainakaan siellä "example" -kansiossa, MUTTA toisaalta, asensin koko XAMPPin uudelleen ja siirsin tämän kyseisen kansion htdocs -kansioon, joten eihän .htaccess ole mitenkään voinut siirtyä sinne :0
LISÄYS: Koodin olen siis tarkistanut ja linkit ohjaavat oikeaan paikkaan
Haraldinho kirjoitti:
Koodin olen siis tarkistanut ja linkit ohjaavat oikeaan paikkaan
Alkuperäinen selityksesi on niin kummallinen, että kertoisitko vielä, mikä on mielestäsi se ”oikea paikka” ja mitä oikein kuvittelet tapahtuvan? Yleensä nimittäin on tarkoitus, että linkissä ja selaimen osoiterivillä lukee /example/about ja htaccessilla ohjataan pyyntö osoitteeseen /example/index.php?p=2.
Haraldinho kirjoitti:
luulisin, että jossain on se .htaccess -tiedosto, mutta ei ainakaan siellä "example" -kansiossa,
Siis mitä ihmettä? Etkö tiedä, missä tiedostosi sijaitsevat? Miten olet päätellyt, että .htaccess-tiedosto ei ole example-hakemistossa?
Metabolix kirjoitti:
mitä oikein kuvittelet tapahtuvan? Yleensä nimittäin on tarkoitus, että linkissä ja selaimen osoiterivillä lukee /example/about ja htaccessilla ohjataan pyyntö osoitteeseen /example/index.php?p=2.
Tuota nimenomaan yritin, mutta ilmaisin sen epäselvästi, myönnän.
Metabolix kirjoitti:
Siis mitä ihmettä? Etkö tiedä, missä tiedostosi sijaitsevat? Miten olet päätellyt, että .htaccess-tiedosto ei ole example-hakemistossa?
Tiedän toki, mutta kun en keksi muutakaan, mistä se voisi johtua. Siitä päättelin, että kun vaihdoin kansion nimen "example", muotoon "example2", ongelma poistui, mutta tarkemmin ajatellen ei se sittenkään tarkoita, etteikö se voisi olla sisällä example -kansiossa. Huoh. Tiedostohaulla en ainakaan löytänyt .htaccessia lukuunottamatta phpmyadminin, apachen ja xamppin omia.
Se oli melkolailla tuollainen. Älä naura äläkä hauku turhaan, kun näytän tämän, tiedän, että olen hölmö:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^\w+$ index.php?p=$0 [L] RewriteCond %{THE_REQUEST} index\.php RewriteCond %{QUERY_STRING} ^p=(\w+)$ RewriteRule ^index\.php$ /%1? [R=301,L]
Pakkohan sen tiedoston on yhä jossain olla, jos se kerran yhä vaikuttaa. Ei tämä ole mitään mystiikkaa.
THE_REQUEST ainakin on aivan väärä, ja muutenkaan tuollaista ehtoa ei tarvita, koska tarkistat kuitenkin tiedostonimen RewriteRule-kohdassa.
Onko jokin erityinen syy ylipäänsä laittaa jälkimmäinen ohjaus htaccessiin?
Metabolix kirjoitti:
Onko jokin erityinen syy ylipäänsä laittaa jälkimmäinen ohjaus htaccessiin?
Ei.
Sivun id haetaan siis tietokannasta ja tulostetaan muotoon "index.php?p={$id}". Ajattelin, että jos XAMPP "luulee", että tuossa index.php tarkoittaa "localhost/index.php", ja ohjaa sivun siksi väärään paikkaan, mutta ei.
Haraldinho kirjoitti:
Sivun id haetaan siis tietokannasta ja tulostetaan muotoon "index.php?p={$id}".
Nyt en taas ymmärrä, mitä yrität. Jos haluat, että osoitteena näkyy selaimessa /example/id, sinun pitää myös tulostaa osoitteeksi /example/id.
Jee, luulisin että sain sen pelittämään, en kyllä vieläkään ymmärrä, mistä vika johtui. Poistin kuitenkin XAMPPin ja kaikki, asensin uudelleen, siirsin tikulta varmuuskopiot ja toimii.
Metabolix kirjoitti:
...sinun pitää myös tulostaa osoitteeksi /example/id.
Tämä lienee tyhmä kysymys, mutta jos tulostan linkin kuten sanoit: /example/id, miten voin viitata siihen, jos niin haluan? Tuolla aiemmalla menetelmällä se onnistui GET -metodilla...
Sitä varten on se RewriteRule: sillä saat kerrottua palvelimelle, että kun pyydetään sivua /example/id, palautetaankin sivu /example/index.php?p=id.
Tämä on ehdottomasti ymmärrettävä, jos haluaa tehdä mitään ”hienoja” osoitteita: Selaimelle linkit ja osoitteet ovat koko totuus. Jos haluat, että selaimessa näkyy osoite X, sinun pitää kaikessa HTML-koodissa, JS-koodissa ja CSS-koodissa käyttää vain ja ainoastaan osoitetta X. Selain toimii täysin sen mukaan: jos linkissä on osoitteena X, selaimen yläpalkkiin tulee osoitteeksi X ja selain pyytää palvelimelta sivua X.
On täysin palvelimen sisäinen asia, jos sivun X koodi sattuukin olemaan oikeasti osoitteessa index.php?id=X. Tämä ei kuulu selaimelle mitenkään. Tästä ei pidä kertoa selaimelle mitään. Kun index.php tulostaa jonkinlaisen nettisivun, sen pitää kaikin puolin esittää, että se ei ollutkaan index.php vaan X.
Tämä on ainoa mahdollinen tapa ”muuttaa osoitteita”. Millään palvelimen asetuksilla et pysty muuttamaan sitä, mitä selaimissa näkyy, vaan voit muuttaa ainoastaan sitä, miten palvelin käsittelee pyynnöt.
Kiitos. Sainhan minä sen nyt toimimaan, en kyllä käsitä tuota aiempaa :)
Metabolix kirjoitti:
Sitä varten on se RewriteRule: sillä saat kerrottua palvelimelle, että kun pyydetään sivua /example/id, palautetaankin sivu /example/index.php?p=id.
Tämä on juuri SE ongelma, jota useimmat eivät tajua.
Monet aloittelijat hakkaavat päätään seinään, kun heidän mielestään .htaccess on konffattu oikein, mutta sivun sisäisiin linkkeihin ei älytä tehdä muutosta.
Sitten ihmetellään, kun kovakoodattu linkki "index.php?p=4" siirtyy jatkuvasti anti-sef-osoitteeseen "index.php?p=4".
Nykyään kun tuo debuggaaminen on aivan ennenkuulumaton taito. Ihmettelen niitä apinoita, jotka eivät osaa edes tulostettua html:ää katsoa, että mitä siellä lukee.
Itse en kylläkään tajua, miksi kaikki aina lähtevät tälle htaccess-purkan linjalle. Johtuuko se siitä, ettei netissä opeteta muuta? Jos reititys tehtäsiin (oikein eli) php-koodissa, niin ehkä se auttaisi myös ymmärtämään, mitä asiassa oikeasti tapahtuu. Nyt htaccess nähdään jonkinlaisena jeesusratkaisuna, joka vain maagisesti tekee kaiken, koska sen toimintamallista ei tajuta yhtään mitään.
Htaccess-räpellykset eivät edes ole palvelinsovelluksesta riippumattomia ratkaisuita ja siksikin ne ovat paskaa. Pitäisi kai kopioida taannoin postaamani esimerkki koodivinkiksi... Oikeastaan sen pitäisi olla laajennus nykyiseen php-oppaaseen.
Lebe80 kirjoitti:
Sitten ihmetellään, kun kovakoodattu linkki "index.php?p=4" siirtyy jatkuvasti anti-sef-osoitteeseen "index.php?p=4".
En minä ainakaan, jos niin ajattelit. Tiesin kyllä, että .htaccess vaihtaa vain selaimessa annetun osoitteen, eikä koko paska linkkejä myöten muutu.
Haraldinho kirjoitti:
Metabolix kirjoitti:
...sinun pitää myös tulostaa osoitteeksi /example/id.
Tämä lienee tyhmä kysymys, mutta jos tulostan linkin kuten sanoit: /example/id, miten voin viitata siihen, jos niin haluan? Tuolla aiemmalla menetelmällä se onnistui GET -metodilla...
Tuossa käsitin Metabolixin viestin väärin. Käsitin, että sivun lähdekoodissa pitäisi lukea "example/id", siksi vähän ihmettelin, mutta tottakai tiedän että jos haluan osoitteeksi "example/id", on se muutettava siihen muotoon .htaccessilla.
Ongelma on kuitenkin nyt ratkaistu, kaikesta huolimatta.
Haraldinho kirjoitti:
Tuossa käsitin Metabolixin viestin väärin. Käsitin, että sivun lähdekoodissa pitäisi lukea "example/id",
Ei, käsitit aivan oikein: sivun lähdekoodissa pitää lukea example/id eikä example/index.php?p=id. Missä muuallakaan se lukisi? Ilmeisesti sinua vaivaa juuri se ongelma, jota Lebe80 myös kuvaili.
Kun tämä sanallinen kommunikaatio näyttää jotenkin olevan mahdotonta, ehkä sinun kannattaisi vain antaa esimerkki, mitä sivun HTML-koodissa linkeissä lukee (kun valitset selaimesta ”näytä sivun lähdekoodi”) ja mitä selaimen osoiterivillä lukee ja mitä htaccess-tiedostossa lukee.
Yritän vääntää rautalangasta.
PHP-koodissa pitäisi lukea näin:
$id = 123; $url = "/example/{$id}"; echo '<a href="'.htmlspecialchars($url).'">linkki</a>';
HTML-koodissa pitäisi lukea näin:
<a href="/example/123">linkki</a>
Linkkiä klikattaessa selaimen osoiterivillä pitäisi lukea näin:
http://localhost/example/123
Palvelimelle pitäisi silloin lähteä pyyntö näin:
GET /example/123 HTTP/1.1 Host: localhost ...
htaccess-tiedostossa pitäisi lukea näin:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^example/(\d+)$ /example/index.php?p=$1 [L]
Palvelimen pitäisi siis suorittaa index.php GET-parametrilla p=123. PHP-koodista kerroin jo tämän tarinan alussa.
Metabolix kirjoitti:
Missä muuallakaan se lukisi?
Esimerkiksi:
example/2
URUUR
Yrititkö qeijo sanoa jotain?
Aihe on jo aika vanha, joten et voi enää vastata siihen.