htaccess 在首次加载时设置 cookie,无需重定向

问题描述 投票:0回答:2

我正在尝试使用 htaccess 制作多语言网站,并将 site.com/de/path 之类的内容翻译为 site.com/path ,并在本例中将语言的 cookie 设置为“de”。目前我有这个解决方案:

RewriteCond %{HTTP_COOKIE}::%{REQUEST_URI} !language=(en|de|fr|ar).*::\/\1\/.*
   RewriteRule ^(en|de|fr|ar)/(.*)$                         /$1/$2 [R,L,CO=language:$1:site.com:2678400:/]
 RewriteRule ^(en|de|fr|ar)/(.*)$                           /$2

但是这是一个重定向,我愿意避免这样做,以减少流量和提高速度,而且有些爬虫可能不喜欢这样。

那么有没有其他方法可以在第一次加载时设置此 cookie 而无需重定向?

我也很好奇为什么 htaccess 在第一次加载时不直接设置 cookie?

注意,仅设置 cookie 而不重定向,如下面的代码所示,将使 cookie 在站点第二次加载时出现在 php 中:

RewriteRule ^(en|de|fr|ar)/(.*)$                         /$1/$2 [CO=language:$1:site.com:2678400:/]

最好还是坚持使用 cookie,因为使用请求参数将语言值发送到脚本可能会扰乱其他带有参数的链接。

在我看来,进一步使用 env 变量作为选项似乎有些牵强,并且不确定它将如何影响服务器及其其他系统。

php .htaccess cookies
2个回答
2
投票

有时简单的描述可能会产生误导。确实,不存在“设置 cookie”这样的事情;有:

  1. 服务器在响应中向浏览器发送
    Set-Cookie: ...
    标头,然后存储该标头
  2. 浏览器在其存储中找到一个值,并在下一个请求中向服务器发送
    Cookie: ...
    标头

这些都不允许 Apache(在服务器上)向 PHP(也在服务器上)发送新的 cookie 信息。 PHP 会看到的唯一 cookies 是那些由浏览器发送的;用户第一次访问您的网站时,不会有任何内容。

因此,除了发送

Set-Cookie
标头之外,您还需要做一些事情,例如

  • 让 Apache 设置一个环境变量,它是服务器上不同进程之间的通信。
  • 不要从 Apache 配置中的 URL 中删除语言,而是在 PHP 中检测它,您可以两者设置当前语言向浏览器发送 cookie

0
投票

除了 @IMSoP 的回答 还解释了为什么

RewriteCond %{HTTP_COOKIE}::%{REQUEST_URI} !language=(en|de|fr|ar).*::\/\1\/.*
RewriteRule ^(en|de|fr|ar)/(.*)$ /$1/$2 [R,L,CO=language:$1:site.com:2678400:/]

...有些爬虫可能不喜欢这样。

SE 爬虫通常根本不发送 cookie,因此依靠 cookie 来保存语言代码将会出现问题。上述规则(查看 cookie 值,如果与 URL 路径中的语言代码不匹配,则重定向到“更正”cookie)将破坏 SE 爬虫(以及阻止或拒绝 cookie 的任何用户) - 因此该网站不会被索引。

设置语言 cookie 的唯一原因(如果有的话)应该是在会话之间保留用户选择的语言。例如。第一次访问时,URL 中缺少语言代码前缀?

RewriteRule ^(en|de|fr|ar)/(.*)$ /$2

您正在通过内部重写删除语言代码前缀 - 因此您实际上并没有更改 URL。我假设这是为了能够提供“静态文件”所必需的?例如。

/en/path/to/file.php

 被内部重写为 
/path/to/file.php
 文件实际所在的位置? (否则,我认为没有理由制定此规则。)

这里似乎根本不需要 cookie、环境变量或“语言”URL 参数,因为可以直接从 URL 路径读取语言代码(例如,解析 PHP 中的

$_SERVER['REQUEST_URI']

 超全局变量)。 

© www.soinside.com 2019 - 2024. All rights reserved.