.htaccess htaccesscookie+;浏览器语言重定向
我们正在努力以“正确的方式”解决语言重定向问题。首先是一些成语: a) 每个路由都有一个标识语言的起始URL参数。e、 英语和西班牙语。还有等等 b) 您也可以省略此参数,例如。然后检测语言(cookie、浏览器语言、qs参数或URL参数)并将其添加到URL。页面位于react中,检测由i18next库完成 c) 每个可能的页面都预先呈现在通过静态服务器提供服务的HTML文件中 请注意,由于路由是预渲染的,因此类似的路由实际上不存在于文件夹结构中(因为在前端检测之前无法猜测语言) 到目前为止有效的方法是:.htaccess htaccesscookie+;浏览器语言重定向,.htaccess,single-page-application,i18next,prerender,language-detection,.htaccess,Single Page Application,I18next,Prerender,Language Detection,我们正在努力以“正确的方式”解决语言重定向问题。首先是一些成语: a) 每个路由都有一个标识语言的起始URL参数。e、 英语和西班牙语。还有等等 b) 您也可以省略此参数,例如。然后检测语言(cookie、浏览器语言、qs参数或URL参数)并将其添加到URL。页面位于react中,检测由i18next库完成 c) 每个可能的页面都预先呈现在通过静态服务器提供服务的HTML文件中 请注意,由于路由是预渲染的,因此类似的路由实际上不存在于文件夹结构中(因为在前端检测之前无法猜测语言) 到目前为止有效
正如您所看到的,它试图通过cookie或浏览器语言进行检测(我们知道此时URL参数不存在)
这种方法很好,但有一个问题
当导航到guestbell.com(大多数人都会这样做)时,这会导致两个重定向:
ErrorDocument 404 /404.html
#This is extremely important as it disables rewriting route from en => en/ and then 403-ing on directory
#https://stackoverflow.com/questions/28171874/mod-rewrite-how-to-prioritize-files-over-folders
DirectorySlash Off
# BEGIN WWW omit
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]
</IfModule>
# END WWW omit
# BEGIN HTTPS redirect
<IfModule BEGIN HTTPS redirectfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
</IfModule>
# END HTTPS redirect
# BEGIN Omit extension
<ifModule mod_rewrite.c>
#remove html file extension-e.g. https://example.com/file.html will become https://example.com/file
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
</ifModule>
# END Omit extension
# BEGIN File detection
<ifModule mod_rewrite.c>
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.php - that file then takes care of language redirection
RewriteRule ^ /index.php
</ifModule>
# END File detection
# BEGIN Compress text files
<ifModule mod_deflate.c>
<filesMatch "\.(css|js|x?html?|php)$">
SetOutputFilter DEFLATE
</filesMatch>
</ifModule>
# END Compress text files
# BEGIN Cache
<ifModule mod_headers.c>
<filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|svg|mp4)$">
Header set Cache-Control "max-age=31536000, public"
</filesMatch>
<filesMatch "\\.(css)$">
Header set Cache-Control "max-age=31536000, public"
</filesMatch>
<filesMatch "\\.(js)$">
Header set Cache-Control "max-age=31536000, private"
</filesMatch>
<filesMatch "\\.(xml|txt)$">
Header set Cache-Control "max-age=2592000, public, must-revalidate"
</filesMatch>
<filesMatch "\\.(html|htm|php)$">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</filesMatch>
<filesMatch "sw.js$">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</filesMatch>
</ifModule>
# END Cache
ErrorDocument 404/404.html
#这一点非常重要,因为它禁用了从en=>en/到目录403 ing的重写路由
#https://stackoverflow.com/questions/28171874/mod-rewrite-how-to-prioritize-files-over-folders
目录删除
#开始省略
重新启动发动机
重写条件%{HTTP_HOST}^www\.(.*)$[NC]
重写规则^%{REQUEST\u SCHEME}://%1%{REQUEST\u URI}[R=301,L]
#结束WWW省略
#开始HTTPS重定向
重新启动发动机
重写基/
重写cond%{ENV:HTTPS}=在…上
重写规则^.*$https://%{SERVER_NAME}%{REQUEST_URI}[R,L]
#结束HTTPS重定向
#开始省略扩展名
#删除html文件扩展名,例如。https://example.com/file.html 将成为https://example.com/file
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写规则^([^\.]+)$$1.html[NC,L]
#结束省略扩展名
#开始文件检测
重新启动发动机
#如果请求了现有资产或目录,请按原样转到该资产或目录
RewriteCond%{DOCUMENT_ROOT}%{REQUEST_URI}-f[或]
重写cond%{DOCUMENT\u ROOT}%{REQUEST\u URI}-d
重写规则^-[L]
#如果请求的资源不存在,请使用index.php-该文件将负责语言重定向
重写规则^/index.php
#结束文件检测
#开始压缩文本文件
SetOutputFilter放气
#结束压缩文本文件
#开始缓存
标题集缓存控制“最大年龄=31536000,公共”
标题集缓存控制“最大年龄=31536000,公共”
标题集缓存控制“最大年龄=31536000,专用”
标题集缓存控制“最大年龄=2592000,公共,必须重新验证”
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
#端缓存
另一种方法是在这种情况下将语言检测留给前端,从而完全失去预渲染。我不太喜欢这样,因为大多数人会导航到页面的根目录,而不是/en,从而失去性能。但让我担心的是,由于多次重定向,性能无论如何都会丢失
我的问题是:
是否可以在htaccess中结合HTTP=>HTTPS进行cookie和浏览器语言重定向?如果是的话,您能为实现这些功能提供帮助吗?如果没有,您能否分享实现这一点的最佳方法,或者验证我们使用PHP的方法是否“足够好”
非常感谢。为什么将https->http重定向视为确定的重定向?请查看选项。事实上,最坏的情况是www=>no www,http=>https,/=>/en,以防有人导航到www.guestbell.com。我猜默认情况下,您的用户不会被引导到最坏的情况,因此我不会集中精力优化重定向,我认为这并不可怕。但我仍然对教育目的的“最佳方法”感兴趣,如果没有其他目的的话。