Разрешения на файлы сессий PHP - PullRequest
0 голосов
/ 26 мая 2009

У меня есть домен domain.com и поддомен sub.domain.com Эти два домена имеют разных пользователей ftp (user1, user2), принадлежащих к одной и той же группе (usergroup) в среде linux. Наконец, у меня есть одно и то же PHP-приложение, которое использует сеансы в обоих доменах (один работает, а другой - среда тестирования).

Когда я захожу на domain.com, не заходя сначала на sub.domain.com, файл сеанса PHP создается в папке по умолчанию / tmp / с соответствующими разрешениями 600 и user1: usergroup, когда я захожу на sub.domain.com без перехода сначала на domain.com создается файл с разрешениями 600 и user2: usergroup.

Все отлично подходит для всех браузеров, кроме IE (пожалуйста, не фокусируйтесь на этом). Я обнаружил, что когда я захожу на sub.domain.com и затем пытаюсь попробовать domain.com, PHP пытается прочитать тот же файл сеанса, но не имеет разрешений, и страница загружается бесконечно. Смена владельца файла на user1 делает работоспособным domain.com, но мешает работе sub.domain.com.

Как заставить Apache или PHP создавать разные файлы для сессий или сделать их доступными из обоих доменов.

P.S. Как я сказал по какой-то странной причине, это происходит только для IE и сообщение об ошибке от PHP: Uncaught PHP Ошибка: session_start () [function.session-start]: открыть (/ tmp / sess_t1 ..., O_RDWR) не удалось: разрешение запрещено (13) в файле xxx.php в строке 46 в строке в строке 46 находится session_start ();

Спасибо за любой совет в этом.

Ответы [ 4 ]

3 голосов
/ 26 мая 2009

Не уверен, что это лучший подход к вашей проблеме, но вы можете попробовать сохранить PHP-файлы сессий в разных каталогах для каждого домена.

Ознакомьтесь с session_save_path () документацией.

Имейте в виду, что вы должны установить его ДО инициализации сеанса.
В идеале, это должно быть одним из первых действий вашего сценария.

1 голос
/ 22 декабря 2009

У меня была такая же проблема. Похоже, проблема в том, как Apache возвращает данные сеанса для IE7 и IE8, но, скорее всего, потому что IE7 и IE8 имеют неправильный способ объявления домена, для которого запрашиваются данные сеанса.

Вот мой сценарий:

Запуск Apache 1.3 с двумя доменами, каждый из которых имеет свою учетную запись со своими пользователями:

Domain: mycompany.com 
Session path: /tmp/
Webserver user: mycompanycom

Domain: support.mycompany.com 
Session path: /tmp/
Webserver user: nobody

Вот что происходит во время обычного посещения Firefox / Safari / Chrome:

  1. Я захожу на mycompany.com, и файл сеанса создается в /tmp/, принадлежащем пользователю mycompanycom.
  2. Затем я захожу на support.mycompany.com, и второй файл сеанса создается в /tmp/, принадлежащем пользователю nobody.
  3. Apache не запутывается, и возвращаются правильные файлы сессии

Однако вот что происходит во время посещения IE7 и IE8:

  1. Я захожу на mycompany.com, и файл сеанса создается в /tmp/, принадлежащем пользователю mycompanycom.
  2. Затем я захожу на support.mycompany.com и вместо создания второго файла сеанса в /tmp/, принадлежащего пользователю nobody, Apache пытается вернуть файл сеанса для mycompany.com.
  3. Файл сеанса для mycompany.com принадлежит пользователю mycompanycom, поэтому веб-сервер, работающий от имени пользователя nobody, не может получить к нему доступ. В доступе отказано.

Решением было, как другие предложили, создать отдельный каталог в /tmp/, чтобы отделить сохраненные данные сеанса для support.mycompany.com:

mkdir /tmp/mycompany
chown nobody:nobody /tmp/mycompany

Затем я добавил следующее в .htaccess файл в корневом веб-каталоге для support.mycompany.com:

php_value session.save_path '/tmp/mycompany'

И, наконец, я удалил все существующие данные сеанса в /tmp/, чтобы обеспечить немедленное использование нового пути сеанса:

rm -f /tmp/sess_*

И это все! Теперь IE7 и IE8 работают правильно.

Я вполне уверен, что эта проблема связана с тем, как IE7 и IE8 запрашивают данные сеанса у Apache. Вероятно, они сначала запрашивают данные сеанса для mycompany.com, а затем запрашивают данные сеанса для support.mycompany.com, хотя последний был единственным доменом, введенным в адресную строку.

1 голос
/ 26 мая 2009

Одним из решений является добавление этого в файл .htaccess каждого субдомена:

php_value session.save_path '/path/to/a/writeable/folder'

Затем убедитесь, что у каждого субдомена есть разрешение на запись в свою собственную папку.

1 голос
/ 26 мая 2009

Вы уверены, что IE вызывает проблему?

Браузер не имеет прямого доступа к файлам сеанса, только процесс PHP (HTTPD) имеет доступ к файлам сессии.

Я не понимаю, почему один браузер должен выдавать разные сообщения об ошибках в журнале PHP, а другой -

Я думаю, что вы можете иметь дело с двумя отдельными проблемами.

...