【问题标题】:.htaccess all directories give 403 Forbidden.htaccess 所有目录给 403 Forbidden
【发布时间】:2016-05-02 21:48:23
【问题描述】:

我在我的多语言网站上使用 .htaccess 来修改一些 URL 以实现良好的 SEO。

默认情况下,所有文件夹都受到 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 not found.

如果我进入就不会发生这种情况 www.mywebsite.com/en

它只是重定向到索引页面。

仔细检查后,我可以看到我网站上的语言切换器自动更改语言,所以如果页面是/team,它的行为类似于/en/team,而在首页上它的行为类似于/en/,而不是@987654334 @。

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/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

然后点击德语版的语言切换器,就成功显示了德语内容,网址是这样的:

www.mywebsite.com/de/team

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

www.mywebsite.com

然后点击德语版本的语言切换器,URL变成这样,它显示403或404页面:

www.mywebsite.com/de/

【问题讨论】:

  • 我猜在某处的服务器设置中。不幸的是,该网站位于共享主机上,我无权访问 Apache 设置。
  • /en 是文件系统上的物理目录吗?如果该目录中没有 DirectoryIndex 文档,则默认响应为 403。
  • 不,/en 不是物理目录。有什么解决办法吗?
  • 没有文件/en.php?你期待/en 加载什么? (即它应该被重写成什么?)目前看起来它只是失败了......但为什么是 403 而不是 404?这不是在“共享主机”的“服务器设置”中配置的。
  • 我想让/en加载索引页/en/index。

标签: php apache .htaccess


【解决方案1】:

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

尝试在您的第一条规则之后添加以下:

RewriteRule ^([^\.]+)/?$ $1/index

这应该被最终规则再次捕获,最终将请求重写为index.php?lang=en。

或者,尝试以下方法:

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

【讨论】:

  • 我再次尝试使用您的代码,并删除了作为测试出现在主服务器上的 Drupal 的 .htaccess,但现在当我输入 www.mywebsite.com/en/ 时它显示 404 not found
  • 我已经更新了我的答案。错过了模式末尾的/?。
  • 是的,我也试过了,RewriteRule ^([^\.]+)/?$ $1/index ...逻辑上,但如果我从 Drupal 的网站上删除 .htaccess,它仍然会显示 404 not found,否则会显示 403 被禁止。这是一个真正令人头疼的问题...... :) 实际上 Drupal .htaccess 不会产生冲突,它只是行为不同,它将 404 页面更改为 403,仅此而已。
  • 而这条新规则紧接在之后第一个RewriteRule和之前第二个规则块? (另外,删除尾随的 RewriteCond 指令,如果您还没有这样做的话。)
  • 我再次编辑了我的主要帖子。请检查一下。我注意到,当我从您那里添加新代码时,它会破坏语言切换器的功能。例如,/de/team 不会更改为德语内容。
猜你喜欢
  • 2012-04-21
  • 2012-07-25
  • 2011-08-09
  • 2014-11-27
  • 2017-05-22
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多