【问题标题】:.htaccess language based RewriteRule like example.com/en/.htaccess 基于语言的 RewriteRule,例如 example.com/en/
【发布时间】:2022-02-08 20:19:12
【问题描述】:

我正在尝试在 .htaccess 中编写重定向指令以在内部转发所有用户请求,如下所示:

  • 语言文件夹中的每个请求都应重定向到带有语言查询字符串的请求文件:
example.com/en/contact.php -> example.com/contact.php?lang=en
  • 将任何没有语言路径的请求重定向到默认语言文件夹,如下所示:
example.com -> example.com/en
  • 如果与地址一起输入,请删除尾部斜杠:
example.com/en/ to example.com/en
  • 对于文件夹项目,每个请求都应指向带有相应查询字符串的 view-project.php 文件:
example.com/en/projects/test -> example.com/view-project.php?lang=en&path=test

这是我的尝试,但如果没有尾部斜杠就无法工作,例如:http://www.example.com/de 并且没有将http://www.example.com 重定向到默认语言文件夹。

RewriteEngine On

RewriteRule ^(en|de)/(.*)$ $2?lang=$1 [L,QSA,NC]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^projects/([^/\.]+)/?$ view-project.php?path=$1 [QSA,L]

我怎样才能做到这一点?

这可能是重复的,对此我深表歉意。我到处搜索并阅读了大约 100 篇帖子,但没有找到我要查找的内容。

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    经过一段时间的努力并在其他人的帮助下,这是适合我的 .htaccess 文件:

    RewriteBase /example.com/
    DirectorySlash Off
    RewriteEngine On
    RewriteOptions AllowNoSlash
    
    RewriteRule ^$ de [R=301,L]
    
    RewriteRule ^(de|en)/$ $1 [R=301,L]
    
    RewriteRule ^(de|en)$ index.php?lang=$1 [L]
    
    RewriteRule ^(de|en)/projects/(.+) view-project.php?lang=$1&path=$2 [L,QSA]
    
    RewriteRule ^(de|en)/(.+) $2?lang=$1 [L,QSA]
    

    【讨论】:

    • 您使用了 301 重定向。你必须非常小心,不要在这些RewriteRules 中犯错误。由于理论上可以无限期缓存 301 重定向。
    【解决方案2】:

    试试:

    RewriteEngine On
    RewriteBase /mysite.com/
    
    RewriteCond %{HTTP:Accept-Language} (en|de) [NC]
    RewriteRule ^ /%1/index.php [L]
    
    RewriteCond %{HTTP:Accept-Language} (en|de)
    RewriteCond %{DOCUMENT_ROOT}%1%{REQUEST_URI} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
    RewriteRule ^(en|de)/(.+)$ $2&lang=$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^projects/([^/\.]+)/?$ view-project.php?path=$1 [QSA,L]
    

    编辑:

    以上是详细解释之前:详细解释之后,我想出了这个解决方案,这与作者提出的解决方案非常相似,而我不知道解释情况的编辑:

    DirectorySlash Off # disables mod_dir slash redirect
    
    RewriteEngine On
    
    RewriteBase /mysite.com/ # rewrites inside /mysite.com/
    
    RewriteOptions AllowNoSlash # stops ignoring the directory redirects that redirect directories without slash, so by default: example.com/dir1 -> example.com/dir2 would be ignored. This is used because DirectorySlash is off
    
    RewriteRule ^(en|de)\/projects\/(.+)$ view-project.php?lang=$1&path=$2 [QSA,L] # rule 4
    RewriteRule ^(en|de)\/(.*)$ $2?lang=$1 [QSA,L] # rule 1
    RewriteRule ^$ en [R=302,L] # rule 2
    RewriteRule ^(en|de)\/$ $1 [R=302,L] # rule 3
    

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多