2017-06-20 89 views
0

我使用PHP7使用我最喜歡的控制方法啓動會話:URL路徑。這用於工作[我這樣做],但不適用於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時,會話將停止讀取變量。

你能幫我理解爲什麼嗎?是的,這個問題的明顯解決方案是「當我這樣做時會感到痛苦,我該怎麼做?」是「不要那樣做」。但就像我說的,我是一個粉絲。坦率地說,這應該工作。唯一的cookie是正確的。 session_id()報告說我正在查看相同的會話ID和文件。與數據填充的會話ID完全相同。正如我們所期望的那樣,刪除/ action1/action2組件並再次顯示$ _SESSION變量。

有誰知道爲什麼會發生這種情況?添加禁用會話的路徑是什麼?爲什麼只要PHP有預期的會話ID,它甚至會關心它?我甚至試圖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 action1。運行domain.com/test.php向您證明會話正在運行。然後運行domain.com/action1並觀察變量消失。

+0

會話文件上可能存在鎖定,因此無法打開它。它不能是權限。此外,您可以啓用日誌記錄到最高級別,並檢查是否可以在日誌中找到更多信息。 – hakre

+0

我將'display_errors'設置爲'E_ALL',我一直在'/ var/logs'文件中查找。我真的很茫然。 – JBH

+0

而當您打開會話文件失敗時,您看不到任何警告? – hakre

回答

0

事實證明,@hakre是在正確的道路上,但改變並沒有解決問題。問題是,Plesk直接分配* .php文件通過php_fpm進行處理。在虛擬主機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套接字的角度來看,突然之間,任何文件都可以作爲一個PHP文件執行,包括客戶上傳的圖片,以及你盲目地放入你的[ROOT]/images目錄。除非你另外告訴Apache,否則只有任何舊文件不會被解釋爲PHP文件。但是,如果您通過網站上傳的所有文件都經過了徹底的審查,以確保它們是他們自稱的內容,並且(b)保存在網站根目錄或數據庫之外,那麼您將得到更好的保護,可以通過直接引用它們來「執行」它們。

最後,應該有一種方法可以在配置文件中覆蓋那些我想故意違反security.limit_extensions的文件。不幸的是,FPM和Apache似乎沒有互相交流,否則使用該塊將完全覆蓋security.limit_extensions。就我所知,有一種方法可以做到這一點。我很想知道,但我有一個工作解決方案,所以我又回到了工作。

1

使用兩個不同的PHP版本:

application/x-httpd-php70每默認處理所有.php文件。

另一方面,application/x-httpd-php處理程序的文件從action1開始。

當您添加該路徑時,apache使用可能會阻止或使用不同會話存儲的其他PHP配置。我不能說具體,因爲我從來沒有創建過這樣的設置,但很可能你只是忘記了爲這些文件使用相同的動作處理程序。

這是Apache中的操作處理程序配置。請參閱文檔https://httpd.apache.org/docs/2.4/handler.html,以便您可以更好地理解正在發生的事情(也許以及第二PHP來自哪裏,您應該能夠在Apache配置中找到它)。