Apache-2.2

.htaccess 使用 mod_rewrite 進行標頭重定向後失去會話,QS___一種大號,問小號一種L, QSA開始會話

  • June 11, 2015

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/sessionwith感到困惑session.save_path

請參閱上面提供的連結中的定義。您可能希望session.save_path單獨/var/www/html/session留下 cookie 路徑。

會話 cookie 路徑將告訴瀏覽器這些 cookie 僅應用於您網站上的某些 URL 路徑。

例如,如果我用session.cookie_pathof設置了一個 cookie,/web/someus然後嘗試訪問/web/somethingelse,那麼之前設置的 cookie 將不會被發送,因為它不在路徑中/web/someus

如果您將 cookie 路徑保留為預設值/,則會話 cookie 將在重定向後發送。

引用自:https://serverfault.com/questions/698090