web-dev-qa-db-ja.com

.htaccessセッションが開始されたmod_rewrite [L、QSA]を使用したヘッダーリダイレクト後にSESSIONが失われました

PHPバージョン5.4.41Apacheバージョン2.2.15Linuxバージョン2.6.32CentOS 6.6

正しくリダイレ​​クトされないコードがいくつかあります。コードと構成がたくさんあるので、できるだけシンプルにしようと思います。ヘッダーのリダイレクト後、セッションが継続的に失われます。エラーも警告もありません...リダイレクトは正常に進行します。私はsession_start(); NULLを取得するためのリダイレクト後のページのvar_dump [$ _SESSION]。リダイレクトの直前にsession_startとダンプを実行すると、セッションは正常にダンプされます。 htaccess mod_rewritesがページ間のセッションをドロップすることと関係があると思いますが、修正方法がわかりません。 [L、QSA]を追加するために読み続けていますが、それは役に立ちません。セッションは、mod_rewritesを使用しない同じサーバー上の単純なページで正常に機能します。

ドメインは、次のように表示されても同じだと思います: http:// localhost:8000/web/someus/loginhttp:// localhost:8000/web/someus/home

Apacheがすべての権限を持ち、サイト内のすべてを所有するように、wwwフォルダー全体を再帰的にchmodedおよびchownしました。

.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に置き換える「home」を含む$ url値のようになります。

header("Location: $url",true,302);
exit();

ホームページで-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

ホームページにリダイレクトするログインページで-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ドメインが一方のドメインで安全であり、もう一方のドメインでは安全でないことは興味深いと思います。それがそれと関係があるかどうかはわかりません。

3
Kevin Nabity

理解した。それは問題の組み合わせだったと思います。 2つの応答(ホストローカルホストを使用し、cookies.pathが混在している)は、おそらくその一部であり、悪い SSL構成 リダイレクトでセッションをドロップします。助けてくれてありがとう!

0
Kevin Nabity

session.cookie_path/var/www/html/sessionに設定されている session.save_path を混同しています。

上記のリンクからの定義を参照してください。おそらくsession.save_path/var/www/html/sessionにし、Cookieパスをそのままにしておきます。

セッションCookieパスは、これらのCookieをサイトの特定のURLパスにのみ使用する必要があることをブラウザに通知します。

たとえば、session.cookie_path/web/someusでCookieを設定してから、/web/somethingelseにアクセスしようとすると、パス/web/someusにないため、以前に設定したCookieは送信されません。

Cookieパスをデフォルトの/のままにすると、リダイレクト後にセッションCookieが送信されます。

0
drew010