セッション変数(PHP)を使用して、訪問者がWebサイトにアクセスしているかどうかを知るWebサイトがあります。彼が新しい場合、私は彼を検出された言語にリダイレクトします。しかし、彼が新しくない場合は、彼がやりたい場所に(他の言語のページも含めて)彼を行かせます。
問題は、これを達成するために使用される変数($ _SESSION ["knownvisitor"])が永続的ではないことです。他のサーバーで同じWebサイトをテストしましたが、問題なく動作するため、セッション構成の問題であると確信しています。問題のあるサーバーは、Apache 2.2.22およびPHP 5.3.10がインストールされたUbuntuサーバー12.04.4です。
セッションは "/ var/lib/php5"に保存されており、ファイルは表示されますが、空です。セッションファイルは「www-data」に属し、「-rw -------」の権限があります。一方、ディレクトリは「root」に属し、これらの権限「drwx-wx-wt」を持っています。
一部のフォーラムで推奨されているように、リダイレクトする前に「session_write_close()」を使用してみましたが、うまくいきませんでした。リダイレクトは「header( 'Location:[URL]')」のようなものです。
スクリプトの基本的な動作を理解できるように、スクリプトのコードを次に示します。これは、Web内のすべてのファイルの先頭に置いたものです。
function detectedlang($availlangs)
{
// FUNCTION STUFF HERE TO FIND OUT WHICH IS THE LANGUAGE OF THE VISITOR
return $detectedlang;
}
session_start();
if (!isset($_SESSION["knownvisitor"]))
{
$detectedlang = detectedlang(array("en", "es"));
$_SESSION["knownvisitor"] = true;
header("Location: http://www.mysite.com/".$detectedlang);
}
/var/lib/php5/session
はroot
が所有し、drwx-wx-wt
の権限を持っているとのことですが、これは、すべてのユーザーがディレクトリにwriteできるが、rootだけがreadできることを意味します。その結果、PHPはセッションファイルを作成できますが、後で戻ってそれらを読み取ることはできません。これが、セッションが失敗した理由であると思われます。
所有権と権限を修正して、www-data
が読み取りと書き込みの両方を行えるようにします(rwx
)。例えば:
chgrp www-data /var/lib/php5/session
chmod g+rwx /var/lib/php5/session