.htaccess - 在 htaccess 中设置条件重定向

标签 .htaccess redirect

我被要求制作一个多语言的现有网站。

为此,我不得不将所有现有页面从/path/page 移动到/en/path/page

为了维护任何现有的传入链接,我现在需要设置一个 htaccess 重定向,以将任何请求从其原始 url 发送到新的/en/path/page url,但我无法使其正常工作。

这就是我目前拥有的;

RewriteCond %{REQUEST_URI} !^/en$
RewriteRule ^(.*)$ /en/$1 [R=301,L]

我认为这是为了检查请求的 URI,如果它不以/en 开头,则在请求的 URI 前面加上/en ......但我显然错了,因为它不起作用。

任何帮助表示赞赏。谢谢你。

更新。
由于这是一个 ExpressionEngine 站点并且有一个额外的规则来删除 URL 的 index.php 部分,这里是两个规则
# Rewrite for new language based urls
# This is to try and get all current pages going to /en/(old url) with a 301 redirect
RewriteCond %{REQUEST_URI} !^/en(/.*)?$
RewriteRule ^(.*)$ /en/$1 [R=301,L]


# Removes index.php
RewriteCond $1 !\.(gif|jpe?g|png|ico)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

我也尝试过在 index.php 之后重写语言。我仍然陷入循环。

最佳答案

它的作用是检查 URI 是否不完全是 /en , 自 $表示紧跟在 en 之后的字符串的结尾.

试试这个,它会检查 URI 是否不完全是 /en/en/或不以 /en/ 开头,如果是这样的话,它会在前面加上 /en/ :

RewriteCond %{REQUEST_URI} !^/en(/.*)?$
RewriteRule ^(.*)$ /en/$1 [R=301,L]

更新 考虑到您在 .htaccess 中的其他规则文件,以下内部重定向到 /index.php... 需要再次匹配语言规则,否则你最终会陷入无限循环。

可能有更好的方法来防止这种情况发生,但是我首先想到的是检查 index.php在第一种情况下:
RewriteCond %{REQUEST_URI} !^/(index\.php|en)(/.*)?$

所以这将导致规则在内部重定向后不适用。但请注意,这仅解决了内部重定向转到 index.php 的特定情况下的问题。 !

关于.htaccess - 在 htaccess 中设置条件重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229829/

相关文章:

wordpress - 如何在 Wordpress 中重定向到 https?

debugging - 如何记录 ssh 调试信息?

php - 重定向到带有 POST 数据的新页面 (PHP/Zend)

linux - (Nginx) Non-HTTP/Non-WWW to HTTPS/WWW 导致 PHP (Without Extension) 文件被下载

linux - 将子域重定向到 .htaccess 中的父域

php - 使用 .htaccess 创建 SEF url

apache - .htaccess:重定向/到index.php并阻止其他所有内容

使用 iptables 将端口 443 (https) 重定向到 IP

ajax - Grails formRemote重定向而不是仅调用方法

.htaccess - 在 Prestashop 的每个页面上启用 SSL