我在我的多语言网站上使用.htaccess进行一些URL修改,以获得漂亮的SEO。
默认情况下,所有文件夹都受到 403 禁止访问的限制,但我想在两条路径上例外。 /de
和/en
.是的,这些路径适用于多语言,当我有这样的页面时:
www.mywebsite.com/en/page
它工作正常,但是当我尝试返回带有如下链接的主页时:
www.mywebsite.com/en
它显示 403 禁止。
这是我的完整代码:
RewriteEngine on
#remove .php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^'.]+)$ $1.php [NC,L]
#redirect lang
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/(.*)$ $2.php?lang=$1 [L]
RewriteCond %{REQUEST_URI} !/en
如您所见,在最后一行,我试图允许访问/en
,但它不起作用。
如何允许访问这些路径:/en
和/de
?
编辑:
经过大量搜索,我发现在Drupal上制作的同一服务器上的主网站有自己的.htaccess文件,这就是为什么它在位于内部单独文件夹中的新网站(自定义cms(上显示403禁止。但是当我从主网站删除 .htaccess 作为测试时,现在在新网站上输入 www.mywebsite.com/en/
时,它显示未找到 404。
如果我输入,这不会发生 www.mywebsite.com/en
它只是重定向到索引页。
仔细检查后,我可以看到我网站上的语言切换器会自动更改语言,因此,如果页面/team
,它的行为就像/en/team
,而在首页上它的行为就像这样/en/
,而不是/en
。
编辑2
我已经遵循了 w3dk 答案,但它仍然显示相同的错误。这是我正在尝试的完整代码:
RewriteEngine on
#remove .php
#RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^'.]+)$ $1.php [NC,L]
RewriteRule ^([^'.]+)/?$ $1/index
#redirect lang
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)/(.*)$ $2.php?lang=$1 [L]
此行RewriteRule ^([^'.]+)/?$ $1/index
中断了语言切换器功能。例如,/de/team
不会更改为德语内容。现在我已经评论了那行,因为它无法正常工作。
我也从我的语言切换器发布代码:
<?php
$currentURL = basename($_SERVER['REQUEST_URI']);
?>
<ul class="language-switcher">
<li><a href="/de/<?php echo $currentURL; ?>">DE</a></li>
<li><a href="/en/<?php echo $currentURL; ?>">EN</a></li>
</ul>
如果我进入此页面
www.mywebsite.com/en/team
之后点击德语版的语言切换器,它成功显示德语内容,URL是这样的:
www.mywebsite.com/de/team
但是,如果我转到具有此 URL 的首页:
www.mywebsite.com
然后单击德语版本的语言切换器,URL变为这样,它显示403或404页面:
www.mywebsite.com/de/
我想
/en
加载索引页/en/index
尝试在第一条规则之后添加以下内容:
RewriteRule ^([^'.]+)/?$ $1/index
然后,最终规则应再次捕获此问题,该规则最终重写了对index.php?lang=en
的请求。
或者,尝试以下操作:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^'.]+)/?$ index.php?lang=$1 [L]