我在我的多语种网站上使用.htaccess对一些优秀的搜索引擎优化进行了一些网址修改。
默认情况下,所有文件夹都受403 Forbidden限制,但我想在两个路径上设置例外。 /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
,并且在首页上的行为类似{{1} }},而不是/en/
。
EDIT2
我已经按照w3dk的回答,但它仍然显示相同的错误。 这是我正在尝试的完整代码:
/en
此行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>
然后单击德语版本的语言切换器,它成功显示德语内容,URL如下:
www.mywebsite.com/de/team
但如果我转到包含此网址的首页:
www.mywebsite.com/en/team
然后点击德语版本的语言切换器,URL就像这样,它显示403或404页面:
www.mywebsite.com
答案 0 :(得分:2)
我希望
/en
加载索引页/en/index
尝试在第一条规则之后添加以下:
RewriteRule ^([^\.]+)/?$ $1/index
然后应该最终将最终重写请求重写为index.php?lang=en
的规则再次捕获。
或者,尝试以下方法:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/?$ index.php?lang=$1 [L]