Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: .htaccess oletusasetukset

Sivun loppuun

Haraldinho [11.12.2013 16:47:49]

#

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.

Metabolix [11.12.2013 18:20:52]

#

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.

Haraldinho [11.12.2013 19:47:05]

#

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

Metabolix [11.12.2013 19:52:50]

#

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?

Haraldinho [11.12.2013 20:01:58]

#

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]

Metabolix [11.12.2013 20:48:16]

#

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?

Haraldinho [11.12.2013 20:54:08]

#

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.

Metabolix [11.12.2013 21:04:27]

#

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.

Haraldinho [11.12.2013 22:40:42]

#

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...

Metabolix [11.12.2013 23:10:10]

#

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.

Haraldinho [12.12.2013 08:29:54]

#

Kiitos. Sainhan minä sen nyt toimimaan, en kyllä käsitä tuota aiempaa :)

Lebe80 [12.12.2013 10:55:18]

#

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".

The Alchemist [12.12.2013 11:25:11]

#

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.

Haraldinho [12.12.2013 11:43:46]

#

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.

Metabolix [12.12.2013 14:38:54]

#

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.

qeijo [12.12.2013 14:54:34]

#

Metabolix kirjoitti:

Missä muuallakaan se lukisi?

Esimerkiksi:

example/2

URUUR

Metabolix [12.12.2013 15:04:49]

#

Yrititkö qeijo sanoa jotain?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta