.htaccess - 使用 .htaccess 切换语言

标签 .htaccess mod-rewrite seo

我想在我的网站上添加另一种语言(一个用 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]

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

最佳答案

最后一个条件检查 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语言的,但是你可以很容易地把它适配成多种语言

关于.htaccess - 使用 .htaccess 切换语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326073/

相关文章:

apache - htaccess 中的 301 重定向将旧文件名附加到新 url

php - .htaccess 如果文件不存在则重定向

.htaccess 将 "/"重定向到非 "/"是 500 内部服务器错误

wordpress - 永久将域名移至子目录而不影响 SEO、Google Analytics

php - 在不更改 url 的情况下加载页面

javascript - 使用 PHP 将简单的 HTML 表单写入 SQL DB,遭到机器人攻击

php - 防止访问除一个之外的所有 php 文件,而不将文件放在单独的文件夹中

php - 如何将请求路由到文档根目录外的 codeigniter 项目

php - 在 .htaccess 或我的 PHP 代码中强制使用 SSL,导致重定向循环错误

mod-rewrite - 消除原始链接的内部 URL 重写 (SEO)