php - htaccess 规则在设置区域设置 cookie 后向 URL 添加区域设置前缀

标签 php .htaccess

我已经使用 php gettext 成功地在我的网站上设置了本地化,并且当访问者选择他们的首选语言时会设置一个浏览器 cookie。

虽然页面以正确的语言显示,但我希望通过在 URL 前加上语言代码(而不是区域代码)来反射(reflect)当前选择的语言。

这是我的 htaccess 文件目前的样子:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^en(/?$|/(.*)) $1?locale=en_GB [QSA,DPI,L]
RewriteRule ^fr(/?$|/(.*)) $1?locale=fr_FR [QSA,DPI,L]
RewriteRule ^de(/?$|/(.*)) $1?locale=de_DE [QSA,DPI,L]
RewriteRule ^es(/?$|/(.*)) $1?locale=es_ES [QSA,DPI,L]
RewriteRule ^ru(/?$|/(.*)) $1?locale=ru_RU [QSA,DPI,L]

假设访问者单击主页上的法语链接,显示给访问者的 URL 是 mysite.com/fr,语言更改为法语。

如果他们随后单击 page1.php 的链接,URL 将更改为 mysite.com/page1.php 并显示法语版的第 1 页。

我希望 URL 显示为 mysite.com/fr/page1.php

我已经尝试将以下行添加到 htaccess,就在 RewriteCond 行的下方,但我显然做错了:

RewriteCond %{HTTP_COOKIE} locale=([a-z]{2}\_[A-Z]{2}) [NC]
RewriteRule ^(.*)$ /%1/$1 [NC,L,QSA]

请注意,在上面的几行中,我试图在 URL 前加上整个语言环境代码(例如 fr_FR),而最终我想要的只是在 URL 前加上前两个字符语言环境代码(例如 fr)。

提前谢谢你。

最佳答案

我认为你不应该为此使用 .htaccess 重写..

  1. 如果用户使用以下 URL 访问您的网站:

http://mysite.com/page1.php你应该弄清楚你想向他展示什么语言并重定向他,例如:http://mysite.com/en/page1.php - 例如,通过查看浏览器语言接受值。

  1. 如果用户使用如下 URL 访问您的网站:

http://mysite.com/en/page1.php那么您什么都不用做,您知道要使用哪种语言。

我强烈建议您不要为此使用 cookie。许多网站为此使用 cookie 完全没有任何目的,它们所做的只是将您发送到您选择的任何语言的页面。如果您默认不接受 cookie(每个人都应该接受),那就太令人气愤了。

请记住,您网站上的所有链接将始终将语言作为其 URL 的一部分,因为如果他们不这样做,您就会回到原处1,您的用户可能会切换回默认语言。在这里使用 cookie 只会使事情复杂化,如果您确实想在使用英文网站一段时间后切换到法语网站怎么办?

我想最重要的是:不要将 cookie 与您的 URL 结合使用来识别资源,因为 cookie 不明显,您指的是哪个资源会变得非常模糊。唯一的异常(exception)当然是当你在做一些身份验证的时候,比如用户帐户等等,但是缺少 cookie 应该总是导致“请登录”,而不是看起来像你想要的东西,但不是'

关于php - htaccess 规则在设置区域设置 cookie 后向 URL 添加区域设置前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429515/

相关文章:

wordpress - 如何使用 WordPress Multisite 重定向特定站点的主页

mysql - 我可以使用 mod_auth_mysql 更新用户数据库的上次登录时间戳吗?

.htaccess - 关闭旧网站后最佳实践重定向到 'under construction' 页面

php - Mysql登录-选择子句

php - 如何在php中将字节数组转换为图像?

php - 将图像上传到数据库时出错

php - htaccess 对未找到但基于 url 中提供的特定目录的文件进行条件重写

html - 编码错误 : why does my medium sized dash is differently encoded on another server?

重启服务器后php无法连接到mysql

php - 是否有开箱即用的 PHP 解决方案来对数据库字段进行修订控制?