Bisqwit::blog - 2003-01-13



--- Mon Jan 13 00:58:02 EET 2003 ---

Uusi päivä taas.


--- Mon Jan 13 03:35:21 EET 2003 ---

http://lists.evolt.org/archive/Week-of-Mon-20020902/121767.html

The problem mentioned on the page referenced above has tormented
me for ages already, and I finally made up a solution for it!

The problem is that Googlebot gets a 406 error for certain php
scripts that are using mod_negotiation (i.e the feature that you
don't have to include .php in every url).

And I finally fixed it.

The problem is as follows:

When you have a file index.php, and you are trying to load url /index,
Apache checks what you are accepting and then decides what to give.
Googlebot gives this kind of headers:

Accept: text/html,text/plain,application/pdf,application/x-shockwave-flash,
        application/vnd.ms-excel,application/rtf,application/msword,
        application/vnd.ms-powerpoint,application/postscript,
        application/x-gzip,application/octet-stream,application/*
From: googlebot(at)googlebot.com
User-agent: Googlebot/2.1 (+http://www.googlebot.com/bot.html)

The mimetype for .php files (in the mod_negotiation terms) is
application/x-httpd-php, and Googlebot doesn't seem to be accepting it.
There's no */* there.
So Apache thinks "no acceptable variant" and grants a 406 error.

Here's the magic how to fix it:

Make a custom 406 error document.
Add "ErrorDocument 406 /oops406.php" in your virtualhost definitions.
You can now make a simple oops406.php that simply prints $_SERVER
or saves it to a file. (I did so for Googlebot.)

Skipping the details, here's my (simplified) oops406.php script
which emulates the feature that Apache already skipped:

<?php
/* Bisqwit's 406 error recovery module (error_document) version 1.0
 * It recovers from 406 error without leaving a trace - except
 * some REDIRECT_ -variables in $_SERVER[].
 * Copyright (C) 1992,2003 Bisqwit (http://bisqwit.iki.fi/)
 */

function Replace406file($old, $new)
{
  $k = strlen($_SERVER['SCRIPT_NAME']);
  return substr($old, 0, strlen($old)-$k) . substr($new, 1);
}

function Get406redirection()
{
  $parse = $_SERVER['REDIRECT_SCRIPT_URL'];
  
  $parts = split('/', $parse);
  
  $m = count($parts);
  
  for($c=$m; $c>0; --$c)
  {
    $s = '.';
    for($k=1; $k<=$c; $k++)
    {
      $s .= '/';
      $part = $parts[$k];
      if($part == '..')continue; // Mild security fix
      $s .= $part;
    }
    $s .= '.php';
    if(file_exists($s))
    {
      $front = $s;
      $back = substr($parse, strlen($s)-5);
      header($_SERVER['SERVER_PROTOCOL'].' 200 I WAS JUST ABOUT TO GIVE YOU 406');
      foreach(array('PATH_INFO' => $back
                   ,'PHP_SELF' => Replace406file($_SERVER['PHP_SELF'], $front)
                   ,'PATH_TRANSLATED' => Replace406file($_SERVER['PATH_TRANSLATED'], $front)
                   ,'SCRIPT_NAME' => Replace406file($_SERVER['SCRIPT_NAME'], $front)
                   ,'SCRIPT_FILENAME' => Replace406file($_SERVER['SCRIPT_FILENAME'], $front)
                   )
              as $var => $value)
      {
        global $$var;
        $_SERVER[$var] = $$var = $value;
      }
      return $front;
    }
  }
}

if($_SERVER['REDIRECT_STATUS'] == 406)
{
  $fixed406handlingfile = Get406redirection();
  if(is_readable($fixed406handlingfile))
  {
    include $fixed406handlingfile;
    return;
  }
}

print "Sorry, 406 error happened. I don't know why.";


The full version of the script is available at
http://bisqwit.iki.fi/source/oops406.php .


--- Mon Jan 13 04:01:00 EET 2003 ---

Uusi yritys Zzzzzz.
Kolme tuntia sitten yritin jo kertaalleen, enkä saanut unta.
Sitten tein yllänäkyvän 406-korjaimen.


--- Mon Jan 13 10:21:56 EET 2003 ---

öärghbl.


--- Mon Jan 13 12:40:39 EET 2003 ---

Tein Apacheen vielä tällaisen jutun:

<VirtualHost 10.104.4.82>
 ServerName bisqwit.stc.cx
 DocumentRoot /WWW/wrongvhost
 RewriteEngine on
 RewriteOptions inherit
</VirtualHost>

<VirtualHost 10.104.4.82>
 ServerName oktober.stc.cx
 DocumentRoot /WWW/wrongvhost
 RewriteEngine on
 RewriteOptions inherit
</VirtualHost>

root@chii:/WWW/wrongvhost# cat .htaccess
RewriteEngine on
RewriteRule ^(.*) http://bisqwit.iki.fi/$1


Ideana, että pääsen eroon urleista, jotka osoittavat
tuohon vanhaan hostiin. Esim. Google ei talleta sivuja,
jotka antavat 302:n, vaan pelkästään sen minne ne vievät.


--- Mon Jan 13 23:05:28 EET 2003 ---

Tänään olen uusinut yllä kertomaani rewriteengine -kikkaa
käyttäen ison osan websivustoani osoitteet, muun muassa tämän
päiväkirjan osoitteet.

Tavoitteena olisi oikeastaan abstraktoida koko
sivustollani kaikista sivuista tekniikka pois
näkyviltä. Eli ei mitään .php -tiedostoja, ja
hierarkiakin riippumattomaksi levyllä olevien
tiedostojen hakemistorakenteesta.

Apachella saa aika helposti tehtyä noita,
esim http://kanjidict.stc.cx/.htaccess
(jonka pitäisi olla maailmalle lukukelpoinen)
näyttää miten kanjidictissä toimii urlien aliasointi.

Vanhat osoitteet toimivat yhä, mutta niistä tulee 302-forwardi
uusiin osoitteisiin. Näin ei hämmennetä käyttäjiä, mutta
hakukoneistot korjaavat tietonsa.


--- Mon Jan 13 23:13:42 EET 2003 ---

Toinen juttu.
Viime viikkoina olen väsännyt POVrayllä erästä animaatiota.
Se on nyt webissä:
  http://bisqwit.iki.fi/kala/povray/tetristest6.avi (6.4 MB)
(Renderointi kesti parikolme päivää 2.6 GHz laskentakapasiteetillä.)

Scenessä käytetyt blokit on generoitu C++ -ohjelmalla, joka ottaa
blokkien kuvauksen ihan vain ascii-muodossa ( ## -tyyliin).
Siirtosarjojen generointi kesti eniten ##
aikaa: tein C++:lla botin, joka pelaa satoja pelejä ja kehittää
omaa taitoaan geneettisellä algoritmilla, jonka päämääränä on saada
hyvä pistemäärä pelissä tietyllä pisteenlaskukaavalla. Algoritmi
jalostaa parametrejä, joilla botti päättelee minkälainen kenttä
on paras vaihtoehdoista kullakin hetkellä.
Yhden yön aikana botin taidot kehittyivät kymmenen kertaa paremmiksi
kuin paras tietokonepelaaja tällä hetkellä Joeltris 10:ssä on.


-- Designed for Lynx/Mozilla viewing ---
All content herein is copyright © 2004 Joel Yliluoma - unauthorized republishing prohibited.
Hakukoneita varten lista kaikista sivuista.