Query string a Nginx

Od kiedy kilka miesięcy temu zmieniłem serwer, a wraz z nim również zmieniłem oprogramowanie (konkretnie porzuciłem Apache na rzecz Nginx), miałem pewien problem z przekazywaniem do aplikacji parametrów GET. Błąd był głupi i wynikający z niedopatrzenia w pisaniu konfiguracji vhosta, ale efekt był całkiem ciekawy.

Problem dotyczył dwóch moich stron, ale skupmy się na niniejszym blogu. O ile na stronie głównej nie było problemu z parametrami GET (przez co zresztą dość długo żyłem w błogiej nieświadomości, myśląc, że wszystko jest w porządku), o tyle na podstronach już niekoniecznie. Wiedziałem co prawda, że coś nie gra z szukajką, ale problemów w innych miejscach nie widziałem i ostatecznie zrzuciłem to na karb koślawego kodu frameworka.

I wszystko było dobrze dopóki nie zacząłem pisać RESTowego API, które już niedługo będzie serwowało posty niniejszego bloga frontendowi napisanemu w Angular.js. API przyjmuje parametry GET np. do paginacji (limit i offset), problem zatem był widoczny od samego początku. Niestety, debugger pokazał coś co najmniej dziwnego: zmienna $_GET była pusta. Myślałem sobie, że może to mój framework. Ale nie, problem był widoczny od pierwszej linijki index.php, a więc zanim odpalona została choćby linijka uMVC. Poza tym, co dziwne, pusta była również zmienna $_SERVER["QUERY_STRING"], za to $_SERVER["REQUEST_URI"] jak wół pokazywało query stringa. Symptom co najmniej interesujący.

No i coś mnie tknęło, żeby zajrzeć do konfiguracji vhost. Znalazłem tam coś takiego:

location / {
    try_files $uri $uri/ /index.php;
}

No niby nic: przekieruj wszelki ruch do pliku index.php, o ile żądanie nie wskazuje na istniejący plik. Ale jednak brakowało czegoś: parametrów query stringa. Fragment powinien oczywiście wyglądać następująco:

location / {
    try_files $uri $uri/ /index.php?$args;
}

W ten sposób do pliku index.php przekazywany jest również query string. Nie wiem, jakim cudem nie zauważyłem tego od razu, a potem przez pół roku nie zauważałem wygenerowanych przez to problemów, ale cóż, nikt nie jest doskonały. Teraz mam nauczkę na przyszłość: lepiej się nie spieszyć i przetestować wszystko bardziej gruntownie niż tylko na stronie głównej. Bo a nuż zamiast w kodzie, problem znajdzie się w konfiguracji vhosta. I zawsze pamiętać o query stringu podczas konfigurowania vhosta dla nowej strony.


Napisz komentarz


Szukaj wpisów


Chmura tagów