【发布时间】: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。