将包含子目录的URL重写为root中的脚本

时间:2015-07-08 14:30:21

标签: php .htaccess mod-rewrite

我试图以语言指示符的方式重定向页面,在URL中将其表示为子文件夹(" en /"," de /&#34 ; ...),转换为我可以使用的参数。 " FR",作为网站的主要语言,没有语言子文件夹。

为了说明这一点:

www.domain/index.html  

应该重定向到

www.domain/index.php?lang=fr

www.domain/en/index.html 

应该重定向到

www.domain/index.php?lang=en

我在.htaccess文件(位于根目录中)中尝试了以下内容:

RewriteEngine On

RewriteRule ^en/index\.html$ /index.php?lang=en [L]   
RewriteRule ^de/index\.html$ /index.php?lang=de [L] 
RewriteRule ^index\.html$ index.php?lang=fr [L]

最后一个按预期工作,但前两个返回404.对于第二行(" de version"),我得到:

The requested URL /de/index.php was not found on this server.

Apache记录以下内容:

[Thu Jul 09 13:14:28 2015] [error] [client ::1] script '/Applications/MAMP/htdocs/testsite/de/index.php' not found or unable to stat

服务器似乎完全忽略了前两个规则,如第二行中更改目标文件名,如下所示:

RewriteRule ^de/index\.html$ /blah.php?lang=de [L]

仍会触发相同的404消息,说明缺少de / index.php而不是blah.php;

然而,将.htaccess放在名为' de'的子文件夹中的工作是什么?并从那里指向

的根文件夹中的index.php
RewriteRule ^index\.html$ /index.php?lang=de [L]

但那不是一个合适的解决方案,是吗?

1 个答案:

答案 0 :(得分:0)

在某些情况下,在规则之前添加此行有助于:

RewriteBase /

此外,在某些服务器配置中,您需要从^/开始,而不仅仅是^。所以规则看起来像这样:     RewriteRule ^ / en / index.html /index.php?lang=en

这为我解决了一次。

只是提示:

EN和DE规则都可以写成单一规则:

RewriteRule ^(en|de)/index.html /index.php?lang=$1

这也可以扩展到任意数量的区域设置,只需用|符号分隔即可。 |基本上是OR运营商。

我测试了这些,他们似乎做了你需要的东西:

RewriteRule ^index\.html /index.php?lang=fr [L]

/index.html - > /index.php?lang=fr

RewriteRule ^en/index\.html /index.php?lang=en [L]

/en/index.html - > /index.php?lang=en

RewriteRule ^de/index\.html /index.php?lang=de [L]

/de/index.html - > /index.php?lang=de

另一个不那么有限的解决方案看起来就像这样:

RewriteRule ^([a-z]{2})/index.html /index.php?lang=$1

/xx/index.html - > /index.php?lang=xx

这实际上需要任意两个字符并将它们设置在$ 1所在的位置。但这可能不是你真正想要的,这只是一个提示。

P.S。这是一个测试重写规则的好工具:LINK