.htaccess 使用 mod_rewrite 進行標頭重定向後失去會話,QS___一種大號,問小號一種L, QSA開始會話
PHP 版本 5.4.41 Apache 版本 2.2.15 Linux 版本 2.6.32 CentOS 6.6
我有一些無法正確重定向的程式碼。有很多程式碼和配置,所以我會盡量讓它盡可能簡單。標頭重定向後,我的會話不斷失去。沒有錯誤,也沒有警告……重定向進行得很好。我 session_start(); 和 var_dump
$$ $_SESSION $$在重定向後的頁面上獲取 NULL。如果我在重定向之前 session_start 並轉儲,則會話轉儲很好。我猜它與 htaccess mod_rewrites 丟棄頁面之間的會話有關,但我不確定如何修復它。我繼續閱讀以添加$$ L, QSA $$但這無濟於事。對於同一台伺服器上不使用 mod_rewrites 的簡單頁面,會話可以正常工作。 我認為域是相同的,看看它是如何從: http://localhost:8000/web/someus/login http://localhost:8000/web/someus/home
我對整個 www 文件夾進行了 chmoded 和 chown,以便 apache 擁有所有權限並擁有站點中的所有內容。
.htaccess 文件如下所示:
RewriteCond %{REQUEST_URI} !=/web/[a-z0-9]{6}/index.php RewriteCond %{REQUEST_URI} !error [NC] RewriteCond %{REQUEST_URI} !css [NC] RewriteCond %{REQUEST_URI} !images [NC] RewriteCond %{REQUEST_URI} !js [NC] RewriteRule ^([a-z0-9]{6})/(.*)$ /web/index.php?id=$1&page=$2 [L,QSA]
httpd.conf 有一個 DocumentRoot:
DocumentRoot "/var/www/html"
httpd.conf 有一個別名設置,如下所示:
Alias /web /var/www/html/website/ <Directory "/var/www/html/website/"> AllowOverride All Order allow, deny Allow from all </Directory>
在 php.ini output_buffering 被打開。
session.cookie_path = /var/www/html/session session.use_cookies = 1 session.use_only_cookies = 1
標頭重定向看起來像 $url 值包含 ‘home’ 用 url 中的 home 替換登錄:
header("Location: $url",true,302); exit();
當我在首頁上 curl -i
我得到:
HTTP/1.1 302 Found Date: Wed, 10 Jun 2015 21:54:38 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.41 Set-Cookie: PHPSESSID=08079c815224b0b129d566dc274e0081; path=/web/someus; domain =127.0.0.1; secure Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=ebde43200c30ad6ac18e88b8bfb71371; path=/web/someus; domain =127.0.0.1; secure Set-Cookie: PHPSESSID=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/web/ webdmo; domain=127.0.0.1; secure; httponly Location: login Content-Security-Policy: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-Content-Security-Policy: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-WebKit-CSP: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block X-Frame-Options: DENY Strict-Transport-Security: max-age=631138519; includeSubDomains Content-Length: 0 Connection: close Content-Type: text/html; charset=UTF-8
當我在重定向到首頁的登錄頁面上 curl -i
我得到:
HTTP/1.1 200 OK Date: Wed, 10 Jun 2015 21:58:21 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.41 Set-Cookie: PHPSESSID=d79a57eaabb9a41e99f4e0dda202a598; path=/web/someus; domain=127.0.0.1; secure Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Security-Policy: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-Content-Security-Policy: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-WebKit-CSP: default-src 'self' 'unsafe-eval' 'unsafe-inline' X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block X-Frame-Options: DENY Strict-Transport-Security: max-age=631138519; includeSubDomains Content-Length: 2890 Connection: close Content-Type: text/html; charset=UTF-8
我認為有趣的是 127.0.0.1 域在一個域中是安全的,而不是另一個域——我不確定這是否與它有關。
弄清楚了。我認為這是一個問題的組合。這兩個響應(使用主機 localhost 並混合了 cookies.path)可能是其中的一部分,以及錯誤的SSL 配置在重定向上丟棄了會話。非常感謝你的幫忙!
您對
session.cookie_path
設置為/var/www/html/session
with感到困惑session.save_path
。請參閱上面提供的連結中的定義。您可能希望
session.save_path
單獨/var/www/html/session
留下 cookie 路徑。會話 cookie 路徑將告訴瀏覽器這些 cookie 僅應用於您網站上的某些 URL 路徑。
例如,如果我用
session.cookie_path
of設置了一個 cookie,/web/someus
然後嘗試訪問/web/somethingelse
,那麼之前設置的 cookie 將不會被發送,因為它不在路徑中/web/someus
。如果您將 cookie 路徑保留為預設值
/
,則會話 cookie 將在重定向後發送。