PHP 版本 5.4.41 Apache 版本 2.2.15 Linux 版本 2.6.32 CentOS 6.6
我有一些代码无法正确重定向。有很多代码和配置,所以我会尝试使其尽可能简单。在标题重定向后,我的会话不断丢失。没有错误,也没有警告……重定向进行正常。我在重定向后的页面上执行 session_start(); 和 var_dump[$_SESSION] 以获取 NULL。如果我在重定向之前立即执行 session_start 和 dump,会话会正常转储。我猜这与 htaccess mod_rewrites 在页面之间丢弃会话有关,但不确定如何修复它。我继续阅读以添加 [L, QSA],但这没有帮助。会话对于不使用 mod_rewrites 的同一服务器上的简单页面工作正常。
我认为域名是相同的,因为它的来源是: http://localhost:8000/web/someus/login http://localhost:8000/web/someus/home
我以递归方式 chmoded 和 chowned 整个 www 文件夹,以便 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 中的 login 替换为 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 域在一个域中是安全的,而在另一个域中却不安全 - 我不确定这是否与它有关。
答案1
你很困惑session.cookie_path
设置/var/www/html/session
为session.save_path
。
请参阅上面提供的链接中的定义。您可能希望session.save_path
保留/var/www/html/session
cookie 路径。
会话 cookie 路径将告诉浏览器这些 cookie 仅应该用于您网站上的某些 URL 路径。
例如,如果我使用 设置了 cookie,session.cookie_path
然后/web/someus
尝试访问/web/somethingelse
,则之前设置的 cookie 将不会被发送,因为它不在路径中/web/someus
。
如果您将 cookie 路径保留为默认路径/
,则会话 cookie 将在重定向后发送。
答案2
搞清楚了。我认为这是多个问题的组合。两个响应(使用主机 localhost 和混杂 cookies.path)可能是其中的一部分,还有糟糕的SSL 配置删除重定向上的会话。非常感谢您的帮助!