is_dir возвращает false по символическим ссылкам в apache - PullRequest
1 голос
/ 07 августа 2011

Я запускаю стороннее PHP-приложение в моем локальном стеке AMP на моем Mac.Недавно я купил новый Mac Mini с Lion и пытаюсь его настроить.Мой предыдущий компьютер был MB MB с MAMP.Теперь я использую встроенный apache / php и самодельный MySQL.

Вот моя проблема: у меня есть каталог с символическими ссылками.Эти символические ссылки относятся к каталогам, и приложение PHP проверяет их с помощью is_dir().

В моей установке Lion AMP эта is_dir() не работает.Та же настройка на моем Snow Leopard MAMP is_dir() отлично работает с моими символическими ссылками.

Вот где это становится более любопытным.Если я выполняю php -a (режим интерактивной командной строки php) и выполняю is_dir() в тех же самых каталогах, это возвращает true.Он возвращает false только в контексте запроса apache.Это заставляет меня думать, что это связано с тем, что пользователь apache (_www) не может получить доступ к символическим ссылкам.Устранение неполадок не входит в мои компетенции.

Другие примечания:

  1. Да, у меня включен FollowSymLinks в моей конфигурации apache и фактически в каталоге, где находятся символические ссылки.вопрос проживать это сама символическая ссылка.У Apache нет проблем с этим.Пока не используется PHP is_dir().
  2. Нет, я не могу редактировать приложение PHP и просто возвращаюсь к is_link() и readlink().
  3. Эта точно такая же настройка работала на моем Snow Leopard/ MAMP setup.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 августа 2011

Ах, вы видели ваш комментарий об изменении их на 777, но все еще удивляетесь, почему это не работает.Мое решение ниже может не помочь вам.

РЕДАКТИРОВАТЬ:

Если у вас есть доступ к /etc/apache2/httpd.conf,
отредактируйте его с помощью sudo vi /etc/apache2/httpd.conf.
Затем измените эти 1 из этихстроки или обе из них

User _www
Group _www

Вот пример моего списка каталогов.

ace:remote-app ace (git::master)$ ls -al
total 72
drwxr-xr-x  24 ace  staff   816  7 Aug 00:24 .
drwxr-xr-x  11 ace  staff   374  4 Aug 13:46 ..
drwxr-xr-x   3 ace  staff   102 12 Jul 17:06 .bundle
drwxr-xr-x  14 ace  staff   476  7 Aug 02:29 .git
-rw-r--r--   1 ace  staff   100  1 Aug 19:20 .gitignore
-rw-r--r--   1 ace  staff     9  1 Aug 19:20 .rspec
drwxrwxr-x  10 ace  staff   340 14 Jul 15:58 public

Теперь мой публичный каталог имеет разрешения 775, что означает owner и groupиметь полные права, в то время как другие пользователи могут только читать и выполнять.
Это зависит от того, хотите ли вы, чтобы пользователь apache стал ace по умолчанию _www или группа apache стала staff по умолчанию _www.

После того, как вы решили, что изменить, перезапустите apache.

/usr/sbin/apachectl graceful

И теперь ваша страница должна иметь доступ к каталогам / файлам.
Следует отметить, что вынеобходимо изменить владельца для файлов, которые уже были записаны на вашей веб-странице, поскольку они имеют _www:_www право собственности, и после перезапуска у вас не будет доступа к ним.
Вы можете изменить их новое владение с помощью этого -Rсделать его рекурсивным.

sudo chown -R newapacheuser:newapachegroup <path>
1 голос
/ 07 августа 2011

Вы проверяли права доступа / владельца?

Из руководства по PHP: Примечание: результаты этой функции кэшируются.

0 голосов
/ 17 сентября 2013

У меня была похожая проблема. Я создал следующую ссылку:

cd /home/mike/uploads
ln -s ./data /sites/www.test.com/docroot/data

Затем я создал файл test.php в /sites/www.test.com/docroot, который просто сделал следующее:

$dir = "/sites/www.test.com/docroot/data";
"is_dir\t\t" .is_dir($dir) ."\n";

Когда я запускал test.php из командной строки, он отображался как is_dir как True, но когда я загружал test.php из браузера через apache, он был False.

Я зашел на /sites/www.test.com/docroot/data и сделал

chmod -R 755 .

Это ничего не изменило. Затем я понял, что для parent для фактического каталога с необходимыми ссылками необходимы надлежащие права доступа (/ home / mike / uploads). Я сделал chmod для этого каталога, и все заработало!

...