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

Php .htaccess所有目录都给出403禁止,php,apache,.htaccess,Php,Apache,.htaccess,我正在使用我的多语言网站上的.htaccess来修改一些URL,以便更好地进行SEO 默认情况下,所有文件夹都限制为403禁止,但我想在两个路径上设置例外/de和/en。是的,这些路径用于多语言,当我有如下页面时: www.mywebsite.com/en/page 它工作正常,但当我尝试返回主页时,会出现如下链接: www.mywebsite.com/en 它显示403禁止 以下是我的完整代码: RewriteEngine on #remove .php RewriteCond %{RE

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

EDIT2

我遵循了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/索引
中断了语言切换器功能。例如,
/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/en
www.mywebsite.com/de/team

但是如果我转到有此URL的首页:

www.mywebsite.com
点击德语版上的语言切换程序,URL如下所示,显示403或404页面:

www.mywebsite.com/de/


我想
/en
加载索引页
/en/index

尝试在第一条规则之后添加以下内容:

最后一条规则会再次捕捉到这一点,该规则最终会将请求重写为
index.php?lang=en

或者,尝试以下操作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/?$ index.php?lang=$1 [L]

我猜在服务器设置的某个地方。不幸的是,该网站位于共享主机上,我无法访问Apache设置。
/en
是文件系统上的物理目录吗?如果目录中没有
DirectoryIndex
文档,那么403将是默认响应。不,
/en
不是物理目录。有什么解决方案吗?而且没有文件
/en.php
?您希望加载的
/en
是什么?(也就是说,它应该被改写成什么?)现在它看起来就像是简单地通过了。。。但为什么是403而不是404?这不是在“共享主机”上的“服务器设置”中配置的内容。我希望
/en
加载索引页
/en/index
。我已使用您的代码重试,并删除了作为测试显示在主服务器上的Drupal的.htaccess,但是现在当我进入
www.mywebsite.com/en/
我已经更新了我的答案时,它显示了
404notfound
。错过了模式末尾的
/?
。是的,我也尝试过,用
重写规则^([^\.]+)/?$$1/索引
…逻辑上,如果我从Drupal的网站删除.htaccess,它仍然显示404找不到,否则它显示403禁止。这真是一个令人头痛的问题……:)实际上Drupal.htaccess不会产生冲突,它只是起到了不同的作用,它将404页更改为403页,仅此而已。这个新规则紧跟在第一个
重写规则之后,第二个规则块之前?(另外,如果您还没有删除尾随的
RewriteCond
指令),我已经再次编辑了我的主要帖子。请检查一下。我注意到,当我添加您的新代码时,它破坏了语言切换器的功能。例如,
/de/team
不会更改为德语内容。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)/?$ index.php?lang=$1 [L]