Korzystając z Apache lub Ngnix zawsze tworzę strony deweloperskie w oparciu o rzeczywiste projekty takie z http://project1.loc
których po dodaniu do mojego .hosts
pliku przeglądarka nie ma problemu z obsługą .
Jednak gdy próbuję wykonać żądanie cURL ( http://project1.loc/post.json
) do tego samego adresu URL, nigdy nie otrzymuję niczego poza limitem czasu. Zakładam, że cURL nie dba o moje niestandardowe hosty i trafia prosto do serwera nazw w celu uzyskania informacji.
Jak mogę to naprawić?
UPDATE Ustawiłem niestandardowy nagłówek „HOST: http: //project1.loc ” i teraz otrzymuję 400 błędów - ale są one natychmiastowe, więc zakładam, że cURL używa przynajmniej pliku hosts ...
EDYTUJ: Chociaż jest to obecnie akceptowana odpowiedź, czytelnicy mogą uznać tę inną odpowiedź użytkownika Johna Harta za bardziej dostosowaną do ich potrzeb. Korzysta z opcji, która według użytkownika Kena została wprowadzona w wersji 7.21.3 ( wydanej w grudniu 2010 , czyli po tej wstępnej odpowiedzi).
W edytowanym pytaniu używasz adresu URL jako nazwy hosta, podczas gdy musi to być tylko nazwa hosta.
Próbować:
gdzie
project1.loc
to tylko nazwa hosta, a127.0.0.1
docelowy adres IP.(Jeśli używasz curl z biblioteki, a nie z wiersza poleceń, upewnij się, że nie umieszczasz
http://
wHost
nagłówku).źródło
HOST
nagłówka.Host
nieHOST
tylko na wszelki wypadek (chociaż myślę, że nie powinno to uwzględniać wielkości liter). Jak powiedziałem, upewnij się, że używasz tylko nazwy hosta wHost
nagłówku, nic więcej (niehttp://
i nie/something
po). Jak skonfigurowałeś plik hosts?Użyj prawdziwej, w pełni kwalifikowanej nazwy domeny (takiej jak
dev.yourdomain.com
), która wskazuje na127.0.0.1
lub spróbuj edytować odpowiedni plik hosts (zwykle / etc / hosts w środowiskach * nix).źródło
system32/drivers/etc/hosts
Wydaje się, że nie jest to rzadki problem.
Sprawdź to najpierw.
Jeśli to nie pomoże, możesz zainstalować lokalny serwer DNS w systemie Windows, taki jak ten . Skonfiguruj system Windows, aby używał localhost jako serwera DNS. Ten serwer można skonfigurować tak, aby był autorytatywny dla dowolnych fałszywych domen, których potrzebujesz, i przekazywał żądania do prawdziwych serwerów DNS w przypadku wszystkich innych żądań.
Osobiście uważam, że jest to trochę przesadzone i nie rozumiem, dlaczego plik hosts nie działa. Ale to powinno rozwiązać problem, który masz. Upewnij się, że skonfigurowałeś również swoje zwykłe serwery DNS jako usługi przesyłania dalej.
źródło
Czy serwer faktycznie otrzymuje żądania i czy poprawnie obsługujesz nazwę hosta (alias)?
Sprawdź dziennik serwera internetowego, aby zobaczyć, jak otrzymano żądanie ...
curl ma opcje zrzutu wysłanego żądania, a otrzymana odpowiedź nazywa się śledzeniem, która zostanie zapisana do pliku.
--ślad
Jeśli brakuje informacji o hoście lub nagłówku - możesz wymusić te nagłówki za pomocą opcji config.
Otrzymywałbym żądanie curl działające w wierszu poleceń, a następnie próbowałbym zaimplementować je w PHP.
opcja konfiguracji to
-K / - config
opcje, które są istotne w curl są tutaj
--trace Włącza pełny zrzut śledzenia wszystkich danych przychodzących i wychodzących, w tym informacji opisowych, do danego pliku wyjściowego. Użyj "-" jako nazwy pliku, aby dane wyjściowe były wysyłane na standardowe wyjście.
-K / - config Określa, z którego pliku konfiguracyjnego mają być odczytywane argumenty curl. Plik konfiguracyjny to plik tekstowy, w którym można zapisać argumenty wiersza poleceń, które następnie zostaną użyte tak, jakby zostały zapisane w rzeczywistym wierszu poleceń. Opcje i ich parametry muszą być określone w tym samym wierszu pliku konfiguracyjnego, oddzielone białymi znakami, dwukropkiem, znakiem równości lub dowolną ich kombinacją (jednak preferowanym separatorem jest znak równości). Jeśli parametr ma zawierać spacje, musi być ujęty w cudzysłów. W cudzysłowach dostępne są następujące sekwencje specjalne: \, \ ", \ t, \ n, \ r i \ v. Ukośnik odwrotny poprzedzający jakąkolwiek inną literę jest ignorowany. Jeśli pierwszą kolumną wiersza konfiguracji jest znak„ # ” znak, reszta linii będzie traktowana jako komentarz.
źródło
http://domain.loc/users/getSettings.xml
wysłałem żądanie do vhosta i to właśnie pokazał access.log127.0.0.1 - - [09/Aug/2010:11:42:55 -0500] "POST /users/getSettings.xml HTTP/1.1" 499 0 "-" "-"
i zgłosił curl. WydajeOperation timed out after 10000 milliseconds with 0 bytes received
mi się, że cURL faktycznie obsługuje vhost, ponieważ access.log pokazuje żądanie. Z drugiej strony, może teraz trafić do właściwej domeny ...Wysyłam prośbę do
Wynik w
-H
pliku dziennika zawierającym:Plik moich hostów wygląda następująco:
źródło
-H
dotyczy pełnego nagłówka, a nie tylko hosta, więc użyj-H 'Host: project1.loc'
. Ponadto, pomimo tego problemu, to żądanie wydaje się działać na właściwym hoście (poprawnie uzyskanym z twojegohosts
pliku przez curl w linii poleceń). To, co nie działa (403), wygląda na problem z uwierzytelnianiem / autoryzacją, więc Twój serwer blokuje te żądania. Proponuję w tym celu naprawić konfigurację serwera.Do konfigurowania wirtualnych hostów na serwerach http Apache, które nie są jeszcze połączone przez DNS, lubię używać:
Gdzie nazwa-hosta to adres IP lub nazwa DNS komputera, na którym działa serwer WWW. Działa to również dobrze w przypadku witryn https.
źródło