【问题标题】:Switching language with .htaccess使用 .htaccess 切换语言
【发布时间】:2018-12-21 21:23:00
【问题描述】:

我想向我的网站添加另一种语言(用 PHP 7 编写的应用程序)。 我发现,良好的 SEO 实践表明,我网站上的每个页面都应该可以从不同的 URL 访问,具体取决于语言。

目前我的 .htaccess 看起来像这样:

RewriteEngine on
Options +FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([a-zA-z0-9-]+)$ $1.php [NC,L]

因此,当用户输入(或单击链接)http://example.com/contact 时,他们会获得页面 contact.php(如果存在)。 我想要实现的是,将http://example.com/en/contact 重定向到同一个文件contact.php,但使用$_GET 参数并且仍然将/contact 重定向到contact.php(没有此参数)。我以为会是:

... everything from above code sample and then:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^en/([a-zA-z0-9-]+)$ $1.php?lang=en [NC,L]

但它不起作用。任何想法为什么以及如何使这项工作?

【问题讨论】:

  • 使用 QSA 标志? [QSA,NC,L]
  • 您使用的是 MVC 模式吗?你有路由组件吗?
  • 如果你真的在地址栏中输入/contact.php?lang=en 会发生什么?这是否按预期工作?
  • 是的,/contact.php?lang=en 工作正常。我只想将 /en/contact 重定向到这个地址,所以我不必在我网站上的每个链接中传递 GET 参数
  • 我认为当它重新路由 $1.php 尝试删除 RewriteCond %{REQUEST_FILENAME}.php -f 条件时,它会打结......我认为无论如何它们都是多余的。

标签: .htaccess mod-rewrite seo


【解决方案1】:

最后一个条件检查en/file.php 是否存在,但从来都不是这样。这就是为什么永远不会满足规则的原因。要么删除它(但它甚至会应用于不存在的文件),或者通过重写错误条件来使用此解决方法

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^en/([^/]+)$ /$1.php?lang=en [NC,L]

为了更完整,您还可以重定向尝试直接访问/contact.php?lang=en 的用户(更适合 SEO)。这是您最终的 htaccess 的样子

RewriteEngine On

# if url is /file.php?lang=en and file exists then redirect to /en/file
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \s/([^/\s\?&]+)\.php\?lang=en\s [NC]
RewriteRule ^ /en/%1? [R=301,L]

# if url is /en/file and /file.php exists then internally rewrite to /file.php?lang=en
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^en/([^/]+)$ /$1.php?lang=en [NC,L]

注意:上面的代码是特定于en语言的,但你可以很容易地适应多种语言

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多