【问题标题】:ie and firefox can not read cookie value while using rewrite apacheie和firefox在使用rewrite apache时无法读取cookie值
【发布时间】:2015-09-07 21:59:48
【问题描述】:

我在使用 IE 和 firefox 时遇到了一个奇怪的问题,但是 chrome 和 safari 工作正常。当我尝试使用多语言站点时,我能够正确地将根页面重定向到所涉及的语言路径,基本上我有如下的 php 代码;

common.php

<?php

session_start();
header('Cache-control: private'); // IE 6 FIX

if(isSet($_GET['lang'])) 
{
    $lang = $_GET['lang'];
    $_SESSION['lang'] = $lang;
    setcookie('lang', $lang, time() + (3600 * 24 * 30),'/');
}

else if(isSet($_SESSION['lang'])) 
{
    $lang = $_SESSION['lang'];
} 

else if(isSet($_COOKIE['lang'])) 
{
    $lang = $_COOKIE['lang'];
} 

else 
{
    $lang = 'en';
    $_SESSION['lang'] = $lang;
    setcookie('lang', $lang, time() + (3600 * 24 * 30),'/');
}


    switch ($lang) 
   {
        case 'en':
        $lang_file = 'lang.en.php';
        break;

        case 'tr':
        $lang_file = 'lang.tr.php';
        break;
    }

include_once($_SERVER['DOCUMENT_ROOT'] . '/lang/'.$lang_file);
?>

.htaccess 如下;

RewriteEngine on

# do not use htaccess any of rule when php post
RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^ - [L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ /$1 [R=301,L]

# add extension if the php file exists:
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*) $1.php [L]

# if cookie set turn /file to /en|tr/file
RewriteCond %{QUERY_STRING} !^lang= [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{HTTP_COOKIE} lang=(en|tr) [NC]
RewriteRule ^((?!(tr|en)).*)$ /%1/$1 [L,R=301]

# if cookie not set then /  to  /en/file
RewriteCond %{QUERY_STRING} !^lang=
RewriteCond %{HTTP_COOKIE} !lang=
RewriteRule ^((?!(tr|en)).*)$ /en/$1? [L,R=301]

# if cookie set then goto there root folder
RewriteCond %{QUERY_STRING} !^lang= [NC]
RewriteCond %{HTTP_COOKIE} lang=(en|tr)? [NC]
RewriteRule ^(?!(tr|en))$ /%1/$1 [L,R=301]

# get meanful /en|tr/file to /en|tr/file?lang=en|tr
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(tr|en)/(.*)$ /$2?lang=$1 [L]

一旦我尝试请求/,它应该读取cookie 值并根据cookie 值转向/en//tr/,但是在ie 和firefox 上它不起作用。

任何帮助将不胜感激。

【问题讨论】:

  • 你没有缩进你的代码?
  • 没有涉及特定代码,因为它们是常规的 php 文件,因为用于网页包括 common.php。问题应该与我假设的 .htaccess 或 ie/firefox 有关。
  • 您是否尝试过从 301 永久重定向中清除浏览器缓存并改用 302 重定向?
  • @linuxman 我说的是 PHP 代码。我发现阅读没有缩进的代码非常困难。
  • 我确实尝试清除浏览器缓存和 cookie。 302 类型的重定向对于 seo 友好的网站来说不是一个好的解决方案,但我没有尝试。

标签: php .htaccess internet-explorer firefox rewrite


【解决方案1】:

删除重定向类型 301 后,代码适用于所有浏览器。不过,我不确定这一举措如何影响 SEO。

RewriteEngine on

# do not use htaccess any of rule when php post
RewriteCond %{REQUEST_METHOD} =POST
RewriteRule ^ - [L]

# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ /$1 [R=301,L]

# add extension if the php file exists:
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*) $1.php [L]

# if cookie set turn /file to /en|tr/file
RewriteCond %{QUERY_STRING} !^lang= [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{HTTP_COOKIE} lang=(en|tr) [NC]
RewriteRule ^((?!(tr|en)).*)$ /%1/$1 [L,R]

# if cookie not set then /  to  /en/file
RewriteCond %{QUERY_STRING} !^lang=
RewriteCond %{HTTP_COOKIE} !lang=
RewriteRule ^((?!(tr|en)).*)$ /en/$1? [L,R]

# if cookie set then goto there root folder
RewriteCond %{QUERY_STRING} !^lang= [NC]
RewriteCond %{HTTP_COOKIE} lang=(en|tr)? [NC]
RewriteRule ^(?!(tr|en))$ /%1/$1 [L,R]

# get meanful /en|tr/file to /en|tr/file?lang=en|tr
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(tr|en)/(.*)$ /$2?lang=$1 [L]

【讨论】:

  • 不要在翻译页面上进行 301 重定向。使用 307
猜你喜欢
  • 2013-08-28
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2011-09-12
  • 2015-08-16
  • 2014-10-12
相关资源
最近更新 更多