.htaccess htaccesscookie+;浏览器语言重定向

.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文件中 请注意,由于路由是预渲染的,因此类似的路由实际上不存在于文件夹结构中(因为在前端检测之前无法猜测语言) 到目前为止有效

我们正在努力以“正确的方式”解决语言重定向问题。首先是一些成语:

a) 每个路由都有一个标识语言的起始URL参数。e、 英语和西班牙语。还有等等

b) 您也可以省略此参数,例如。然后检测语言(cookie、浏览器语言、qs参数或URL参数)并将其添加到URL。页面位于react中,检测由i18next库完成

c) 每个可能的页面都预先呈现在通过静态服务器提供服务的HTML文件中

请注意,由于路由是预渲染的,因此类似的路由实际上不存在于文件夹结构中(因为在前端检测之前无法猜测语言)

到目前为止有效的方法是:

  • 您可以导航到guestbell.com
  • 您将通过htaccess重定向到https
  • 如果找到文件,请将其送达
  • 如果找不到该文件,请提供一个编写如下的PHP文件:
  • 
    
    正如您所看到的,它试图通过cookie或浏览器语言进行检测(我们知道此时URL参数不存在)

    这种方法很好,但有一个问题

    当导航到guestbell.com(大多数人都会这样做)时,这会导致两个重定向:

  • HTTP=>HTTPS
  • /=>/en
  • 理想情况下,我希望消除这种额外的开销,并在一个重定向中完成。唯一的方法(我现在可以想象)是通过htaccess实现。问题是我不知道这是否可能

    这是当前的htaccess for completion:

    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。我猜默认情况下,您的用户不会被引导到最坏的情况,因此我不会集中精力优化重定向,我认为这并不可怕。但我仍然对教育目的的“最佳方法”感兴趣,如果没有其他目的的话。