strona główna

mod_rewrite na home, Gengo 0.5

Dwie dobre wiadomości i jedna zła, niekoniecznie w tej kolejności:

  1. wczoraj pojawiło się nowa wersja Gengo – wtyczki do Wordpressa pozwalającej na wygodne pisanie tekstów w więcej niż jednym języku. W wersji 0.5 autor, Jamie Talbot, poprawił zdaje się wszystkie błędy które znalazłem podczas prób używania 0.4 na moim blogu, więc może będę już mógł z niej skorzystać,
  2. niestety, podczas prób instalacji 0.5 na moim Business Server w home.pl chyba trafiłem na błąd w tutejszym serwerze WWW; szczegóły dalej,
  3. podczas szukania informacji na temat tego serwera dowiedziałem się, że home w końcu udostępnił mod_rewrite. Sprawdzone, działa, nareszcie będzie można korzystać z ładnych i czytelnych adresów.

Teraz o problemie z serwerem, na przykładzie pliku phpinfo.php:

<?php
if ($HTTP_GET_VARS['test'])
{
phpinfo();
}
else
{
header("Location: /phpinfo.php/en/?test=1");
}
?>

Sens działania jest prosty: otwieram w przeglądarce adres http://elksoft.pl/phpinfo.php, skrypt powinien przekierować na samego siebie z dodatkowymi parametrami i wtedy wyświetlić informacje o środowisku (funkcja phpinfo()). Tak robi, a interesujący fragment tego co wyświetla to:

QUERY_STRING test=1
REQUEST_METHOD GET
REQUEST_URI /phpinfo.php
SCRIPT_NAME /phpinfo.php
SCRIPT_FILENAME /phpinfo.php
SCRIPT_URL /phpinfo.php
SCRIPT_URI http://elksoft.pl/phpinfo.php

I to jest to miejsce, w którym coś tu oszukuje. Według specyfikacji po przekierowaniu lokalnym (bez podania protokołu i adresu maszyny) serwer musi utworzyć stronę identyczną z tą, jaką otrzymałbym wpisując w przeglądarce adres http://elksoft.pl/phpinfo.php/en/?test=1. A tego nie robi, bo wpisując ten adres w przeglądarce otrzymuję:

QUERY_STRING test=1
REQUEST_METHOD GET
REQUEST_URI /phpinfo.php/en/?test=1
SCRIPT_NAME /phpinfo.php
SCRIPT_FILENAME /phpinfo.php
SCRIPT_URL /phpinfo.php/en/
SCRIPT_URI http://elksoft.pl/phpinfo.php/en/

Niestety Gengo polega na zawartości REQUEST_URI i, niestety, głupieje przy takim zachowaniu serwera. Pozostaje poszukać, może uda się to niedużym nakładem pracy obejść.

Dodane: przekombinowałem, da się to sprawdzić w sposób bardziej czytelny i dający więcej informacji.  Dwa skrypty, /a.php tylko przekierowuje na /b.php?test=1, który z kolei wypisuje wyżej opisaną tabelkę.  Wynik otwarcia strony http://elksoft.pl/a.php:

QUERY_STRING test=1
REQUEST_METHOD GET
REQUEST_URI /a.php
SCRIPT_NAME /b.php
SCRIPT_FILENAME /b.php
SCRIPT_URL /a.php
SCRIPT_URI http://elksoft.pl/a.php

Czyli na przemian, część zmiennych jest ustawiana poprawnie (QUERY_STRING, SCRIPT_NAME, SCRIPT_FILENAME), a część pozostaje z pierwszego wykonania (REQUEST_URI, SCRIPT_URL, SCRIPT_URI).
Sprawy trochę komplikuje fakt, że stara, oficjalna specyfikacja CGI nie definiuje zachowania Location aż tak dokładnie, a nowa wyszła tylko jako draft.  Apache, jak się okazuje, idzie na łatwiznę i przy każdym przekierowaniu, niezależnie od tego, czy lokalnym czy z nazwą protokołu i serwera, odsyła do klienta 302 z nowym adresem, co działa bardzo dobrze, chociaż na pewno wolniej.
Jako obejście najprościej będzie wymusić przekierowania na "pełne" adresy, ze wskazaniem nazwy serwera.

O autorze: nazywam się Marcin Kaszyński i od ponad 10 lat zajmuję się tworzeniem oprogramowania, od projektowania przez programowanie do zarządzania projektami włącznie. Prowadzę warsztaty Django, będące szybkim i łatwym sposobem na poznanie tego środowiska i rozpoczęcie pracy z pełnym wykorzystaniem jego możliwości.

2 Responses to “mod_rewrite na home, Gengo 0.5”

  1. Jamie
    April 7th, 2006 12:25
    1

    Hi Marcin,

    I think I understand the problem you are having, even though it’s all in Polish! User-defined whitelisting of URLs will be in version 0.6 as this has been requested by a couple of people.

    Cheers,

    Jamie.

  2. marcink
    April 7th, 2006 12:48
    2

    Jamie: hi, nice to see you here :)

    My post is not about whitelisting, but about a problem with the web server my hosting provider uses. It does not set REQUEST_URI correctly after a local redirect: the two tables are the results of the script above called via http://elksoft.pl/phpinfo.php and http://elksoft.pl/phpinfo.php/en/?test=1, respectively. With the Location header returned by phpinfo.php those tables should be identical (CGI spec says so).

    This is why I did not report the problem to your forum: it looks to me like this server’s problem, not yours. I think I will add a workaround for this, perhaps changing Gengo a bit to check PATH_INFO too (it gets set properly after redirection).

    That said, thanks for the tip and for your work on a really useful plugin. I hope to make this blog bilingual soon :)

Dodaj komentarz