Löytyykö jostakin kattavaa listaa merkeistä, joita ei voi käyttää tai jotka aiheuttavat ongelmia mod_rewritellä ohjattavissa osoitteissa? Haluan säilyttää/tukea mahdollisimman paljon Unicoden / UTF-8:n merkkejä, esim. otsikoita osoitteissa minimaalisesti siistittynä.
Minulla on .htaccess tyyliä:
Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.+) index.php?title=$1 [L,QSA]
Huomasin tässä Windowsin Apachessa sellaisen lisäongelman Linuxiin verrattuna, että ainakin kaksoispiste (%3A) aiheuttaa aina ongelman (Apache tarjoilee Forbidden-sivua). Sitä taas esimerkiksi MediaWiki viljelee runsaalti, joten ilmeisesti sitä voi kuitenkin käyttää?
Ainut lista jonka tiedän on tämä:
# <>[]|{}./&:?@
Löytyy MyBB:n Google SEO -pluginin asetuksista.
Googlella en löytänyt kuin yleistä mod_rewrite-infoa ohi tämän nimenomaisen ongelman ja olisi kiva säästää turhaa vaivannäköä. Useimmat oppaat myös keskittyvät lähinnä yksinkertaiseen "latinointiin" tai puhtaaseen GET-arvojen mulkkaamiseen vähän siistimmän näköiseksi, en ole löytänyt infoa tästä haluamastani osoitetyylistä. MediaWikin koodiin en ole vielä uskaltanut kajota.
Olet löytänyt aivan väärää tietoa. Toimivien merkkien suhteen ei ole mitään rajoitusta. RewriteRule ottaa Perl-yhteensopivan säännöllisen lausekkeen, eli eräät erikoismerkit pitää escapettaa \-merkillä. Äkkiä mieleen tuleva lista on ()[]{}|\?+* sekä piste ja väli. Lisäksi toki ? ja # täytyy selaimen puolella polussa URL-enkoodata, koska muuten ? aloittaa queryn ja # aloittaa fragmentin.
Ongelmista valtaosa näyttää tulevan siitä, että olen nyt Windowsin alla ja ilmeisesti Apache ajaa osoitteen Windowsin tiedostojärjestelmän sääntöjen läpi, jolloin saan forbiddeniä kun osun merkkeihin jotka eivät ole sallittu tai merkki ei sovi Windowsin sääntöihin. Esimerkiksi:
localhost/"Tämä toimii"
localhost/"Tämä" ei toimi
localhost/"Tämä"/"toimii"
localhost/Tämä\ei toimi
Ilmeisesti tämän takia joitakin rajoituksia on mm. tuohon Google SEO:on asetettu. Otin joskus jo pitkän aikaa sitten yhteyttä Google SEO:n tekijään noista merkkirajoituksista, kun en huomannut ongelmia siitä, että joitakin merkkejä siitä poistin. Toisaalta taas muutamia merkkejä on myös täytynyt lisätä myöhemmin takaisin mukaan kun jonkin keskustelun linkki ei olekaan toiminut, mutta en tiedä johtuuko ongelma esimerkiksi Google SEO:n koodista vai MyBB:n rajallisuuksista.
Ja vielä että tulee selväksi, niin minä en puhu nyt RewriteRulen rajoituksista, vaan tiettyjen merkkien ongelmista nättien osoitteiden muuttamisessa/ohjaamisessa. Tuo ohjauksenihan on käsittääkseni täysin toimiva ja oikein tehty (vaikka muutoin regexp on minulle heikompi osa-alue). Apachen ongelmat Windowsin alla nostaa kysymyksen, onko vastaavankaltaisia ongelmia eri muodossa myös Linuxin puolella. Yleisesti toimivaa toteutusta varten kun kuitenkin täytyy saada jotakin tolkkua rajoituksista.
Sinänsä en ymmärrä, miksi Apachen ylipäänsä tarvitsisi ajaa osoite Windowsin tarkistusten läpi ennen käsittelyä. Jos näin on, olisi ehkä paikallaan laittaa aiheesta bugiraportti. Esimerkkejäsi en ymmärrä: Millä tavalla osoitteet toimivat tai eivät toimi? Minkä nimisiä tiedostoja noilla osoitteilla päädytään lukemaan?
Linuxissa perinteisesti kiellettyjä ovat olleet vain NUL-merkki ja /-merkki. Windowissa toki on suurempi joukko historiallisia rajoituksia. Itse varmaan poistaisin osoitteesta kaikki ASCII-alueen merkit paitsi aakkoset ja numerot, koska niiden käytännön hyöty osoitteissa on aika vähäinen ja oudot osoitteet voivat aiheuttaa hämmennystä tai ongelmia esimerkiksi foorumeille kopioituina.
Ei toimi = Apache palvelee forbidden-sivun.
Toimiva taas ohjaa localhost/index.php:hen kuten .htaccessissa lukee.
Luonnollisesti nuo merkit localhost/ jälkeen olisi url-koodattuja, luettavuuden vuoksi kirjoitin kuten Firefox osoitteen näyttäisi.
Muoks!
Nyt saatoin vihdoin löytää jotakin aiheesta: http://www.dracos.co.uk/code/apache-rewrite-problem/
Muoks taas!
Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{THE_REQUEST} /([^?\ ]+) RewriteRule ^.*$ index.php?title=%1 [L,QSA]
Tällä sain kaksoispisteen ja lainausmerkit toimimaan kuten niiden pitäisi, mutta keno on vielä aika vastentahtoinen rajoittava tekijä. Virheilmoitus on sentään edes jokseenkin järkevästi "not found".
Okei, nyt on tullut vähän enemmän selvyyttä tähän. Tuo ylläolevakaan ei ratkaissut ongelmaa täysin. Ongelmia syntyy Windows-Apachella silloin kun osoite näyttää jokseenkin tältä (huom. ei urlencodea):
http://localhost/Tämä:ei toimi:Forbidden
http://localhost/Tämä"ei toimi"Forbidden
http://localhost/virtuaalihakemisto/Tämä:toimii
http://localhost/virtuaalihakemisto/Tämä"toimii"
Kielletyt merkit on niitä, joita ei saa esiintyä Windowsin tiedostonimissä. Sitä en tiedä, miksi ne sitten yllättäen alkaa toimia heti kun niitä edeltää yksikin /-merkki. En ole vielä kokeillut miten Linux-Apache reagoi, eli onko siellä sitten vastaavia tiedostojärjestelmästä tulevia merkkirajoituksia/-ongelmia.
Olen nyt laajentanut systeemiäni sillä tavalla, että uusi .htaccess näyttää tältä:
Options +FollowSymLinks <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=CCBB_ROOT:/ccbb/] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?forum/(.*)?$ %{ENV:CCBB_ROOT}index.php [PT,L,QSA,E=CCBB_PRETTY_URL:$1] # Domain-juuren osoite: #RewriteRule ^/?(.*)?$ %{ENV:CCBB_ROOT}index.php [PT,L,QSA,E=CCBB_PRETTY_URL:$1] </IfModule>
Tällä tavoin .htaccess määrää sen, mikä virtuaalihakemisto on käytössä, ja pystyn PHP-koodin kautta myös selvittämään sen lukemalla arvon REDIRECT_CCBB_PRETTY_URL - varmistan myös, että siitä on tietokannassa kopio, jotta voin kirjoittaa oikeat osoitteet linkkeihin silloinkin kun käyttäjä on sivulla muuten kuin virtuaalihakemiston kautta. .htaccessin poisto tunnistuu automaattisesti, eikä systeemi yritä sen jälkeen tarjoilla linkkejä, jotka ei toimi.
Samalla olen laajentanut koodini ymmärtämään/tarjoamaan monenlaisia eri osoitetyylejä:
- http://localhost/forum/Sivun_nimi
- http://localhost/ccbb/index.php/Sivun_nimi
- http://localhost/ccbb/index.php?title=Sivun_nimi
- http://localhost/ccbb/?title=Sivun_nimi
Virtuaalihakemiston nimen voi myös määrittää samaksi kuin oikean hakemiston nimen, tosin siitä voi tietysti syntyä joitakin ongelmia (mm. puuttuva tiedosto tuleekin käsitellyksi index.php:n kautta).
Joudun varmaan vielä joskus tekemään hienosäätöjä tähän järjestelmään kiitos erilaisten palvelinympäristöjen, mutta nyt tämän pitäisi toimia aika hyvin Apachella ja enemmän tai vähemmän Apache-yhteensopivilla palvelinsoftilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.