.htaccess 使用 mod_rewrite [L, QSA] 进行标头重定向后丢失会话并启动会话

.htaccess 使用 mod_rewrite [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 和 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/sessionsession.save_path

请参阅上面提供的链接中的定义。您可能希望session.save_path保留/var/www/html/sessioncookie 路径。

会话 cookie 路径将告诉浏览器这些 cookie 仅应该用于您网站上的某些 URL 路径。

例如,如果我使用 设置了 cookie,session.cookie_path然后/web/someus尝试访问/web/somethingelse,则之前设置的 cookie 将不会被发送,因为它不在路径中/web/someus

如果您将 cookie 路径保留为默认路径/,则会话 cookie 将在重定向后发送。

答案2

搞清楚了。我认为这是多个问题的组合。两个响应​​(使用主机 localhost 和混杂 cookies.path)可能是其中的一部分,还有糟糕的SSL 配置删除重定向上的会话。非常感谢您的帮助!

相关内容