Obowiązuje ograniczenie open_basedir. Plik (/) nie znajduje się w dozwolonej ścieżce (ścieżkach):

89

Otrzymuję ten błąd podczas przesyłania awatara na moją stronę. Nigdy wcześniej go nie rozumiałem i ostatnio nic się nie zmieniło, abym zaczął otrzymywać ten błąd ...

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):
Sieć internetowa
źródło
19
Zaakceptowałeś niedziałającą odpowiedź.
sjas

Odpowiedzi:

-23

Zmodyfikuj open_basedirustawienia w konfiguracji PHP (patrz Konfiguracja środowiska wykonawczego ).

To open_basedirustawienie służy przede wszystkim do uniemożliwienia skryptom PHP określonego użytkownika dostępu do plików na koncie innego użytkownika. Dlatego zazwyczaj wszystkie pliki na Twoim koncie powinny być odczytywane przez własne skrypty.

Przykładowe ustawienia za pośrednictwem, .htaccessjeśli PHP działa jako moduł Apache w systemie Linux:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>
Nikesh
źródło
2
@Nikesh To dało mi błąd 500 po tym, jak opuścił ją w moich .htaccces i zmienił ścieżki do: /my/cutsom/dir/. Nie wiem, dlaczego myślałem.
hitautodestruct
79
Super, jak dotąd 12 głosów za nieprawidłową odpowiedź. Nie możesz używać php_admin_valuew .htaccessplikach . Nie można używać DirectoryMatch w plikach .htaccess . (Jaki byłby rodzaj zabezpieczenia, gdyby open_basedirmożna go było wyłączyć?)
Álvaro González
1
@eoinoc - Przewiń w dół i zobacz np. odpowiedź Andrei. Lub edytuj globalny plik php.ini.
Álvaro González
19
NIE WŁĄCZAJ TEGO DO SWOJEGO DOSTĘPU! ALE RATHER W SWOIM PLIKU KONFIGURACYJNYM APACHE.
tfont
8
Włączenie katalogu głównego do open_basedir całkowicie mija się z celem open_basedir. To rozwiązanie „działa” tylko w tym sensie, że zasadniczo wyłącza ograniczenie.
Martin
118

Zmodyfikuj ustawienia open_basedir na swoim koncie hostingowym i ustaw je na żadne. Znajdź ustawienie open_basedir podane w obszarze „Ustawienia PHP” w Plesk / cPanel. Ustaw go na „brak” z podanego tam menu. Pokazałem je na zdjęciu panelu Plesk.

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

yogihosting
źródło
1
@yogihosting Po wykonaniu tej czynności wystąpił błąd - Nie można zlokalizować określonego modelu: Home_model
Heemanshu Bhalla
1
Trochę za późno, ale czy istnieje sposób, aby to zrobić w przypadku wszystkich witryn plesk? Ustawiłem na none w globalnym php.ini dla wersji używanej przez strony: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Ale nadal pojawia się błąd.
Matt Cowley,
@MattCowley musisz to zrobić dla każdej witryny hostowanej w panelu plesk.
yogihosting
1
Dzięki za to rozwiązanie! To działa idealnie dla mnie na hostingu współdzielonym!
Smilefounder
38

Aby rozwiązać ten błąd, musisz edytować plik httpd.conf. Na długo wcześniej można było to zobaczyć w phpinfo w sekcji dyrektywy apache2handler. Server Root. Na przykład w moim przypadku w ten sposób - / etc / httpd / httpd.conf. Otwórz plik httpd.conf, znajdź wzmiankę o parametrze open_basedir. I ustaw go na zero. ( php_admin_value open_basedir none )

Andrei
źródło
Ustawienie „none” działało dla mnie - używając również interfejsu Plesk.
diggersworld,
10
Znalazłem open_basedirkonfigurację w moim php.ini. (Arch Linux na Raspberry Pi z php 5)
Dennis van der Schagt
2
Znalazłem go również w moim php.ini (również Arch). Po prostu zakomentuj linię, aby osiągnąć ten sam efekt, co ta odpowiedź.
Ben Elgar
@BenElgar tylko komentując wiersz wspomniał o pracach, pytam tylko, czy istnieje ryzyko
mwangaben
6

Jeśli prowadzisz to z php file.php. Musisz edytować php.ini Znajdź ten plik:

: locate php.ini
/etc/php/php.ini

I dołącz ścieżkę do pliku do open_basedirwłaściwości:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected

śmierć anioła908
źródło
Jest to jedyne rozwiązanie, które wskazuje wiele określonych ścieżek zamiast po prostu pomijać całkowicie zabezpieczenia.
mvreijn,
5

Dla mnie problemem były złe / brakujące wartości konfiguracyjne dla serwera Plesk, na którym działa całość. Po prostu postępowałem zgodnie ze wskazówkami tutaj: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

Możesz skonfigurować PHP tak, aby miał oddzielny plik dziennika błędów dla każdej definicji VirtualHost. Sztuczka polega na tym, aby dokładnie wiedzieć, jak to ustawić, ponieważ nie można bezpośrednio dotknąć konfiguracji bez zerwania Pleska. Każda nazwa domeny na twoim (dv) ma swój własny katalog w / var / www / vhosts. Typowy katalog zawiera następujące katalogi najwyższego poziomu:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

Będziesz chciał utworzyć plik vhost.conf w folderze conf / katalogu domeny z następującymi wierszami:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

Zmień pierwszą wartość, aby była zgodna z rzeczywistą instalacją (użyłem /tmp/phperrors.log). Po zakończeniu edycji pliku vhost.conf przetestuj konfigurację z konsoli za pomocą:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

I wreszcie powiedz Pleskowi, że dokonałeś tej zmiany.

/usr/local/psa/admin/bin/websrvmng -a
Josh P
źródło
2

Ścieżka, do której się odnosisz, jest niepoprawna i nie dotyczy katalogu głównego twojego obszaru roboczego. Spróbuj zbudować bezwzględną ścieżkę do pliku, do którego chcesz uzyskać dostęp, gdzie prawdopodobnie używasz teraz ścieżki względnej ...

NDM
źródło
Używa ścieżki absolutnej. Działa dla wszystkich użytkowników oprócz tego.
Webnet
2

jeśli masz tego rodzaju problem z ispconfig3 i otrzymałeś taki błąd

Obowiązuje ograniczenie open_basedir. Plik (/ var / www / clients / client7 / web15) znajduje się poza dozwolonymi ścieżkami: .........

Aby go rozwiązać (w moim przypadku), po prostu ustaw PHP na SuPHP w panelu strony internetowej ispconfig3

Mam nadzieję, że to komuś pomoże :)

Qlimax
źródło
2

Miałem ten problem na jednej z moich stron wordpress po aktualizacji i / lub przeprowadzce :)

Sprawdź w tabeli bazy danych „wp_options” „upload_path” i odpowiednio ją edytuj ...

Bartuzz
źródło
jaką wartość ustawiłeś? /[...]/public_html/wp-content/uploads?
brett
1

Jeśli jest używany ispconfig3:

Przejdź do sekcji Witryna -> Opcje -> PHP open_basedir:

wprowadź opis obrazu tutaj

  • W tym polu opisano dozwolone ścieżki, a każda ścieżka jest oddzielona znakiem „:”

/ var / www / clients / client2 / web3 / image: / var / www / clients / client2 / web3 / web: / var / www / ... i tak dalej

  • Więc tutaj należy umieścić ścieżkę, do której chcesz mieć dostęp, w moim przypadku to:

/ var / www / clients / client2 / web3 / image:

  • Problem pojawia się, ponieważ:

Kiedy skrypt próbuje uzyskać dostęp do systemu plików, na przykład przy użyciu funkcji include lub fopen (), sprawdzane jest położenie pliku. Gdy plik znajduje się poza określonym drzewem katalogów, PHP odmówi dostępu do niego.

Pavel Kenarov
źródło
0

Jeśli używasz stosu PHP IIS i masz ten błąd, zwykle jest to szybka poprawka uprawnień.

Jeśli sam administrujesz serwerem Windows i masz do niego dostęp, spróbuj NAJPIERW:

Przejdź do folderu, który sprawia ci kłopot podczas pisania, i kliknij go prawym przyciskiem myszy> otwórz właściwości> zabezpieczenia.

Zobacz, którzy użytkownicy mają dostęp do folderu, którzy mają tylko do odczytu, a którzy są pełne. Czy masz grupę, która blokuje pisanie?

Poprawka będzie specyficzna dla Twojej konfiguracji usług IIS. Czy używasz uwierzytelniania anonimowego z IUSR określonego użytkownika, czy z tożsamością puli aplikacji?

W każdym razie w końcu dodasz nowe pełne uprawnienia do zapisu dla jednego z IUSR, IIS_IUSRS lub tożsamości puli aplikacji - tak jak powiedziałem, będzie się to różnić w zależności od konfiguracji i sposobu, w jaki chcesz to zrobić, możesz przejść do króliczej dziury google na tym jednym (jeden taki post - uprawnienia IIS_IUSRS i IUSR w IIS8 ) Dla mnie używam anon z moją tożsamością puli aplikacji, więc mogę uciec MACHINE_NAME\IIS_IUSRSz pełnym odczytem / zapisem w dowolnym temp. lub przesyłaniu lornetka składana.

Nie muszę dodawać nic więcej do mojego open_basedir =w php.ini.

RobDigital
źródło
0

Oprócz odpowiedzi @ yogihosting , jeśli używasz DirectAdmin , wykonaj następujące kroki:

  1. Przejdź do strony logowania DirectAdmin. Zwykle jego port to 2222.
  2. Zaloguj się jako administrator. Jego nazwa użytkownika jest admindomyślna.
  3. Z „Poziomu dostępu” na prawym panelu upewnij się, że jesteś na „Poziomie administratora”. Jeśli nie, zmień na to.
  4. W sekcji „Dodatkowe funkcje” kliknij „Niestandardowe konfiguracje HTTPD”.
  5. Wybierz domenę, którą chcesz zmienić.
  6. Wprowadź konfiguracje, które chcesz zmienić, w obszarze tekstowym u góry strony. Należy wziąć pod uwagę istniejący plik konfiguracyjny i na jego podstawie zmodyfikować wartości. Na przykład, jeśli widzisz, że open_basedirjest ustawiony wewnątrz a <Directory>, być może powinieneś otoczyć swoją zmianę powiązanym <Directory>znacznikiem:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. Po wprowadzeniu niezbędnych zmian kliknij przycisk „Zapisz”.

  8. Powinieneś teraz zobaczyć swoje zmiany zapisane w pliku konfiguracyjnym, jeśli były prawidłowe.

Istnieje jednak inny sposób edycji pliku konfiguracyjnego:

Przestroga : zachowaj ostrożność i wykonaj poniższe czynności na własne ryzyko, ponieważ możesz napotkać błędy lub doprowadzić do przestoju. Zalecany sposób jest poprzedni, ponieważ zapobiega niepoprawnej modyfikacji pliku konfiguracyjnego i wyświetla błąd.

  1. Zaloguj się do swojego serwera jako root.
  2. Iść do /usr/local/directadmin/data/users . Spośród wymienionych użytkowników przejdź do jednego związanego z domeną, którą chcesz zmienić.
  3. Tutaj jest httpd.confplik. Zrób z tego kopię zapasową:

    cp httpd.conf httpd.conf.back
    
  4. Teraz edytuj plik konfiguracyjny za pomocą wybranego edytora. Na przykład, edytować istniejące open_basedirdo none. Nie próbuj usuwać rzeczy, w przeciwnym razie możesz doświadczyć przestoju. Zapisz plik po edycji.

  5. Zrestartuj serwer WWW Apache, używając jednego z następujących sposobów (użyj w sudorazie potrzeby):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. Jeśli napotkasz jakiekolwiek błędy, zastąp główny plik konfiguracyjny plikiem z kopii zapasowej i zrestartuj serwer WWW.

Ponownie, pierwsze rozwiązanie jest preferowane i nie powinieneś próbować drugiej metody za pierwszym razem. Jak zauważono w przestrodze, zaletą pierwszego sposobu jest to, że zapobiega on zapisywaniu źle skonfigurowanych rzeczy.

Mam nadzieję, że to pomoże!

MAChitgarha
źródło
0

Używam Apache vhost -File do uruchamiania PHP z opcjami ini specyficznymi dla aplikacji na moim serwerze Windows. Dlatego używam -d opcji polecenia php.

Ja ustawienie open_basedir dla każdego zastosowania jako jednej z tych opcji.

Musiałem ustawić wiele adresów URL jako open_basedir, w tym ścieżkę UNC , a składnia dla tego przypadku była nieco trudna do znalezienia. Musisz oddzielić ścieżki średnikami, a jeśli pierwsza ścieżka zaczyna się od literki sterującej, może być konieczne rozpoczęcie listy również średnikiem. Przynajmniej to działa dla mnie.

Przykład:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/
Fanax
źródło
-3

Po prostu wyszukaj

open_basedir =

w php.ini i wyłącz go. To najprostsze rozwiązanie tego problemu.

Przed zmianami open_basedir =

Po zmianach ;open_basedir =

Ps - Po zmianach nie zapomnij zrestartować serwera.

Cieszyć się ;)

Lalit Giriya
źródło
3
nie rób tego ... bezpieczeństwo jest ważne, wierz lub nie . :) Czas przeczytać dokumenty dotyczące twoich narzędzi: php.net/manual/en/ini.core.php#ini.open-basedir
Adam Lenda