.htaccess 所有目录都给出 403 禁止


.htaccess all directories give 403 Forbidden

我在我的多语言网站上使用.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]