Siedząc w nocy przy komputerze, do głowy włażą dziwne myśli. Mi jakoś włączyło się klikanie po starych "hiciorach", które podobały mi się kiedy ludzie jeszcze walczyli z dinozaurami. I tak, wpadłem na Kasta Skład. Muszę powiedzieć, że przekaz w owych czasach, bardzo zapadł mi w pamięć i wyorał we mnie pewne piętno, co, dla osób znających mnie bliżej, jest oczywiste. Był taki czas, że znajdowałem się pod ostrymi naciskami rodziny, przyjaciół, nauczycieli i osób pobocznych. Ciągle upierałem się jednak na swoim i, jak widać, na złe mi to nie wyszło. Jednak ta cząstka mnie, nadal tu jest i jest czujna, czeka, żeby wyskoczyć z głośnym A chuja!
;) Taki sobie kawałek.
W końcu, podczas długiego posiedzenia w pracy sponsorowanemu przez Systemowi Operacyjnemu z Redmond oraz testom aplikacji wykonanym przez klientów, w końcu mam kiedy coś napisać. Jest do dosyć zabawne, bo od dłuższego czasu (jakichś trzech godzin) system zmienia uprawnienia dla kilku plików (około miliona plików w sumie), a my w tym czasie zajmowaliśmy się... różnymi rzeczami, którymi zajmują się informatycy mający nadmiar czasu. O!
Jutro, a właściwie już dzisiaj, jest mój ostatni dzień w pracy przed urlopem. Przez bite trzy tygodnie będę robił inne rzeczy niż zajmowanie się klientami i rozwiązywanie dziwnych problemów. Dawno nie miałem urlopu dłuższego niż tydzień, to na pewno będzie ciekawe.
W planach, między innymi, mam odwiedzenie starych znajomych, bo nie widzieliśmy się już chyba ponad rok. Czy plany wypalą - zobaczymy. Tymczasem spróbuję poklikać wpis niedzielny, który już zawisł na jakieś dwa tygodnie. Niemiło.
Jakiś czas temu zostaliśmy uderzeni po gębie ciekawym problemem z pobieraniem docx/dotx itp. plików przez IE ze strony, która serwowała dostęp do SVN przez http. Normalnie by się rozeszło po kościach, człowiek by kulturalnie dodał odpowiedniego mime'a do Apache i zapomniał, że cokolwiek takiego miało miejsce. Niestety DAV + Apache lubi olewać takie mało znaczące rzeczy jak mime type. A dodatkowo pewien feature w IE sprawy nie ułatwił.
IE jest na tyle inteligentny, że nie poprzestaje na sprawdzeniu rozszerzenia pliku i Content-Type, który dostaje od serwera - dodatkowo sprawdza jeszcze 200 pierwszych bajtów pobieranego pliku... i tu jest pies pogrzebany. Plik docx w rzeczywistości jest archiwum ZIP, w którym znajdują się odpowiednie pliki XML skladające się na dokument docx. IE zatem, widząc, że ściąga się docx, próbuje go zapisać jako... zip. Logiczne. Nie pozwala oczywiście zmienić przy tym rozszerzenia, które rozpoznał, bo przecież jest prawidłowe! Ficzer ten, może i przydatny, tym razem okazał się niezłym wrzodem na dupie... Raz, że klienci postanowili używać "Jedynej Słusznej Przeglądarki Internetu", która jest Bezpieczna i Bardzo Dobrze Przetestowana, i żadna znana nam siła nie potrafiła ich przekonać, że są inne przeglądarki; dwa, że mogli byśmy się z nimi spierać jeszcze długo, ale to wstrzymywało dość pilne prace.
Przeszukując Internet za rozwiązaniem, niestety nie udało mi się znaleźć rozwiązania dokładnie na ten problem. Jednak kombinując i szukając natchnienia, szukając po tematach pokrewnych, udało się problem rozwiązać. Nie jest to może rozwiązanie ani piękne, ani zgodne ze standardami, których uczą w szkołach, ale działa.
Trik polega na tym, żeby przekonać IE, że plik, który aktualnie użytkownik stara się ściągnąć to NIE jest zip, mimo, że tak wygląda. Niestety, takie podejście nie pozwoli nam tego rozwiązać. Dowiedziałem się jednak (a jakże, z dokumentacji), że IE nie wnika w plik i zgadza się go ściągnąć w postaci, w jakiej serwer go serwuje, kiedy zobaczy w nagłówku Content-Distposition: attachment;. Dzięki tej informacji, rozwiązanie okazało się dość proste.
RewriteEngine On
RewriteRule ^(.+\.docx|dotx|pptx|sldx|ppsx|potx|xlsx|xltx)$ - [E=IEFIX:attachment]
RewriteRule !^(.+\.docx|dotx|pptx|sldx|ppsx|potx|xlsx|xltx)$ - [E=IEFIX:inline]
Header set Content-Disposition "%{IEFIX}e"
Szybki opis jak to działa, dla osób, które nie kumają jak działa mod_rewrite: Pierwsza linijka mówi, że mod_rewrite jest włączony (po ustawieniu RewriteEngine na Off, nie trzeba komentować linijek poniżej). W drugiej linijce sprawdzamy rozszerzenie pliku, jeśli jest to jeden z docx, dotx, pptx, sldx, ppsx itd., to zostawiamy link nienaruszony (po to jest znak - "minus" za znakiem dolara) i ustawiamy zmienną IEFIX która będzie od tej chwili zawierała string attachment
. Kolejna regułka sprawdza dokładnie odwrotnie: jeśli rozszerzenie nie jest jednym z podanych, ustawia zmienną jako inline
. Ostatnia linijka (wymaga mod_header) podmienia w nagłówku Content-Disposition, który jest wysyłany do klienta, na wartość zmiennej, którą ustawiło nam mod_rewrite. Voila.
Jeśli ktoś wie jak w mod_rewrite sprawdzić, czy zmienna jest ustawiona, lub zrobił to w sposób bardziej efektywny, to chętnie poprawię i przyjmę nowe informacje. ;)