【问题标题】:Disable PHPSESSID from URL [duplicate]从 URL 禁用 PHPSESSID [重复]
【发布时间】:2012-07-23 10:25:28
【问题描述】:

可能重复:
My web host is adding ?PHPSESSID=fgh2h45… to the end of the URL
How I can remove PHPSESSID in Symfony2

我使用 Symfony 2 开发了我的网站,因此我尝试从 URL 中删除 PHPSESSID,然后我将代码放入 /web/.htaccess 中:

    SetEnv SHORT_OPEN_TAGS 0
SetEnv REGISTER_GLOBALS 0
SetEnv MAGIC_QUOTES 0
SetEnv SESSION_AUTOSTART 0
SetEnv ZEND_OPTIMIZER 1
SetEnv PHP_VER 5_4
DirectoryIndex app.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
#remove PHPSESSID 
RewriteCond %{QUERY_STRING} PHPSESSID=.*$ 
RewriteRule .* %{REQUEST_URI}? [R=301,L]
</IfModule>

然后我注释上面的代码禁用 PHPSESSID,但它会产生另一个问题,我的网站的所有 URL 中都出现了 app.php:

www.mysite.com/app.php/.....

所以我不知道我能做什么,我想我遇到了新问题,因为我使用了多个 RewriteRule。

【问题讨论】:

  • @j0k 是的,这可能是同一个主题,但不是同一个问题......

标签: apache .htaccess symfony apache2


【解决方案1】:

不要重写 URL 来删除PHPSESSID,而是配置 php 使用 cookie 进行会话:

在php.ini:

session.use_cookies=1
session.use_only_cookies=1
session.use_trans_sid=1

或.htaccess:

php_flag session.use_cookies 1
php_flag session.use_only_cookies 1
php_flag session.use_trans_sid 1

或在php 中 - 在所有页面中包含的某个文件中,在session_start() 之前:

<?php
ini_set("session.use_cookies", 1);
ini_set("session.use_only_cookies", 1);
ini_set("session.use_trans_sid", 1);
?>

最后但并非最不重要的一点是,无论如何,让我们用mod_rewrite 来做这件事:

<IfModule mod_rewrite.c>
RewriteEngine On

# first, remove PHPSESSID and redirect
RewriteCond %{QUERY_STRING} ^(.*)PHPSESSID=[^&]*(.*)$ 
RewriteRule .* %{REQUEST_URI}?%1%2 [R=301,L]

# then, silently rewrite everything to app.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

这样,只有PHPSESSID=smth参数被删除,其余的查询字符串被传递。

【讨论】:

  • 您的解决方案是正确的,但我使用的是 OVH,所以我没有 php.ini 和 .htaccess,当我喜欢您的第二个解决方案时,我有错误 500...
  • session.use_trans_sid 需要设置为 0(而不是 1)以禁用在 URL 中传递会话 ID!
【解决方案2】:

在执行从查询字符串中删除 PHPSESSID 的重定向之前,您正在重写 URI 到 app.php。您想在此之前这样做,以免 %{REQUEST_URI} 被重写。

尝试将DirectoryIndex app.php 下的所有内容替换为:

<IfModule mod_rewrite.c>
RewriteEngine On

# remove PHPSESSID first
RewriteCond %{QUERY_STRING} PHPSESSID=.*$ 
RewriteRule .* %{REQUEST_URI}? [R=301,L]

# rewrite to app.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

</IfModule>

【讨论】:

  • 会有副作用。如果 OP 只想从 uri 中删除 PHPSESSID 参数,这种方法将擦除整个查询字符串...
  • @Jon Lin 我尝试了你的新代码,直到现在都可以正常工作,我不知道 app.dev 是否​​会再次出现,所以我会等待,因为我在它不起作用之前做了相同的代码,但它现在工作!
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多