2017-06-20 4 views
0

PHP7を使用して、これは私がやっている方法では動作していましたが、PHP7では動作しません。完全に正常なhello worldの例から始めましょう。?action1 =&action2 =を使用するのではなく、/ action1/action2を使用するとSession_startがセッションを読み取れません。

<?php 
session_start(); 
if(TRUE){ 
    $_SESSION['test'] = 'Hello World!'; 
} 
print_r($_SESSION); 
echo "<P>".session_id(); 

これをTRUEで実行すると、この赤ちゃんは完全に動作します。それをFALSEに設定すると、期待どおりの結果が得られます。それを繰り返し実行すると、同じ結果が得られます。セッションファイルにアクセスして、変数が保存されていることを確認することもできます。

今、私はドメインパスを使用して自分のコードを制御するファンです。 E.G.、example.com/action1/action2 Action1は私の.htaccessファイルでPHPの型ファイルとして識別され、私のdoc_rootにはシンボリックリンクaction1 - > index.phpがあります。これはうまくいきますが、これらのパスをURIに追加すると、セッションは変数の読み込みを停止します。

理由を理解できたら助かりますか?はい、明らかな解決策は、「私がこれをすると痛いです。どうすればいいですか?それはしないでください。しかし、私が言ったように、私はファンです。率直に言って、これはうまくいくはずです。唯一のクッキーは正しいです。 session_id()は、同じセッションIDとファイルを調べていると報告しています。データで満たされているのと全く同じセッションID。/action1/action2コンポーネントを削除すると、$ _SESSION変数が再び表示されます。

これはなぜ起こるのですか?セッションを無効にするパスを追加することはどうですか?予想されるセッションIDを持っている限り、PHPはなぜ気にしますか?私もfile_get_contents()セッションファイルを試してみたので、内容はsession_decode()でした。アクションパスがなければ、ファイルを読み込んで処理することができます。アクションパスで(ドラムロールしてください...)私もファイルを読むことができません。所有権の変更のようなものがありますが、私はファイルとディレクトリの権限を広く開いています。何か案は?

.htaccess: 
RewriteEngine On 
RewriteBase/
AddHandler application/x-httpd-php70 .php 
<Files action1> 
    SetHandler application/x-httpd-php 
</Files> 

編集:これを自分でテストする場合は、最初のファイルをtest.phpに保存し、次に示すように.htaccessファイルを更新します。最後にln -s test.php action1domain.com/test.phpを実行して、セッションが機能していることを証明してください。次にdomain.com/action1を実行し、変数が消えるのを見てください。

+0

セッションファイルを開くことができないように、セッションファイルにロックが存在する可能性があります。アクセス許可であってはなりません。また、最高レベルのログを有効にして、ログで詳細を確認できるかどうかを確認することもできます。 – hakre

+0

'display_errors'を' E_ALL'に設定しました。 '/ var/logs'ファイルを探していました。私は本当に迷っています。 – JBH

+0

セッションファイルを開けなかった場合、警告が表示されません。 – hakre

答えて

0

@hakreは正しい経路にありましたが、変更によって問題は解決されませんでした。問題は、Pleskがphp_fpmで処理する* .phpファイルを直接割り当てることです。仮想ホストのApacheの設定ファイルでは、我々は持っている...

<Files ~ (\.php$)> 
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000 
</Files> 

これは、PleskがPHPのバージョンをドメイン名で別のバージョンに具体的に付加する方法です。このルールに当てはまらないものは、Apacheのグローバルルールによって解釈されます。これは、PHPの別のインストールを見ています。 (PleskがPHPインストールをポイントするためのグローバルオーバーライドを持っていないのはなぜか不思議ですが、これはこれまでに遭遇したことのないバグだと思われます)。したがって、論理的には、我々は.phpの接尾辞なしで処理したい各ファイル...

<Files action1> 
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000 
</Files> 

は、あなたがこれを行う必要というのは本当ですが、私にとっては宣伝通りに動作しませんでした。私のウェブページは単に「アクセスが拒否されました」と言っています。私のエラーファイルからFPMのsecurity.limit_extensionsパラメータが指摘されました。言い換えれば、私がサフィックスなしで使用したいファイルを特定するにもかかわらず、FPMはそれをとにかく拒否しました。ここで私は怠惰になった。変数を何もリセットしません。 Pleskのではそれは...作成またはドメインのconfディレクトリ内のphp.iniファイルを変更し、(それが既に存在しない場合は、ヘッダーを含む)を追加することによって行われます

[php-fpm-pool-settings] 
security.limit_extensions = 

Apacheを再起動し、ボブのあなたの叔父。

本当に急速なGoogle検索によれば、Pleskの中からFPMパラメータを直接変更する機能はまだ議論の余地があります。

今、これには価格が付いています。 FPMソケットの観点から、あなたがアップロードしたイメージや盲目的にあなたの[ROOT]/imagesディレクトリに置いたイメージを含めて、PHPルートファイルであるあなたのファイルは突然PHPファイルとして "実行"できます。あなたは、Apacheに別の方法で言わない限り、古いファイルはPHPファイルとして解釈されないという事実によって、部分的に救われます。ただし、サイトを通じてアップロードするすべてのファイルが、(a)自分が主張しているものであることを徹底的に査定し、(b)Webルートの外に保存するか、DBに保存して誰もいないようにするそれらを直接参照することによってそれらを実行することができます。

最後に、意図的にsecurity.limit_extensionsに違反したいファイルを設定ファイルで上書きする方法があるはずです。残念なことに、FPMとApacheは互いに対話しているようには見えません。そうしないと、ブロックを使用するとsecurity.limit_extensionsが完全に上書きされます。私が知っているすべてのために、それを行う方法があります。私は知りたいと思うだろうが、実用的な解決策があるので、私は仕事に戻ります。

1

次の2つの異なるバージョンのPHPを使用している:すべての.phpファイルのデフォルトあたり

application/x-httpd-php70ハンドラを。

そして、action1で始まるファイルのためのapplication/x-httpd-phpハンドラです。

このパスを追加すると、apacheは別のPHP設定を使用して、別のセッションストアをブロックまたは使用する可能性があります。私はこのような設定を作成したことがないので、具体的には言えませんが、ファイルに対して同じアクションハンドラを使用することを忘れている可能性があります。

これはApacheでのアクションハンドラの設定です。何が起きているのかをよく理解できるように、ドキュメントhttps://httpd.apache.org/docs/2.4/handler.htmlを参照してください(おそらく、その2番目のPHPがどこから来たのか、Apacheの設定でそれを見つけることができるはずです)。

関連する問題