如何在.htaccess中将子目录设置为根目录?

时间:2016-11-01 10:23:50

标签: apache .htaccess

我想将子文件夹设置为根文件夹,这意味着通过在根目录之前附加目录来重写每个请求的URL,例如

example.com/cat/ -> example.com/public/cat/
example.com/cat/black/ -> example.com/public/cat/black/
example.com/public/cat/ -> example.com/public/public/cat/

我已经尝试了

Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteRule (.*) /public/$1 [L]

但是当我请求其任何页面时,我收到内部服务器错误。

1 个答案:

答案 0 :(得分:1)

到目前为止规则是正确的。内部错误来自无休止的重写循环。

当您请求example.com/cat时,它将被重写为example.com/public/cat。但是这个新的URL被反馈到重写模块中,example.com/public/cat被重写为example.com/public/public/cat,被重写为example.com/public/public/public/cat,依此类推,直到超出某个内部计数器和Apache报告内部错误。

要解决此问题,您必须添加condition,告诉Apache停止进一步重写。为此,您可以在重写发生时使用Apache设置的variables之一。

RewriteCond %{REDIRECT_STATUS} ^$
RewriteRule (.*) /public/$1 [L]

如果REDIRECT_STATUS为空(^$),则会进行检查。当它为空时,进行重写。在重写之后,REDIRECT_STATUS将被设置而不是空的,因此不会再进行进一步的重写。

如果你不重写

example.com/public/cat/ -> example.com/public/public/cat/

如果请求的网址不以public开头,您也可以检查,例如

RewriteRule !^public/ /public%{REQUEST_URI} [L]