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

Apache 如何将子目录设置为.htaccess中的根目录?,apache,.htaccess,Apache,.htaccess,我想将一个子文件夹设置为根文件夹,这意味着在每个请求的URL的根文件夹之前附加一个目录,从而重写每个请求的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 +FollowSym

我想将一个子文件夹设置为根文件夹,这意味着在每个请求的URL的根文件夹之前附加一个目录,从而重写每个请求的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]

但是当我请求它的任何页面时,我得到了内部服务器错误。

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

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

要解决这个问题,您必须添加一个,它告诉Apache停止进一步重写。为此,当发生重写时,可以使用Apache设置的其中一个

RewriteCond %{REDIRECT_STATUS} ^$
RewriteRule (.*) /public/$1 [L]
这将检查
重定向\u状态是否为空(
^$
)。当它为空时,执行重写。重写后,
REDIRECT\u STATUS
将被设置且不为空,因此不会再进行重写


如果你不重写的话

example.com/public/cat/ -> example.com/public/public/cat/
如果请求的URL不是以
public
开头,您也可以进行检查,例如:

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

真奇怪。我想如果我不重定向,它只会从重写的路径发送文件,而不会重新启动整个过程。检查重定向状态有点麻烦,所以我将使用第二个。没有任何标志或东西可以用来重写响应的路径?或者在不破坏结构语义的情况下使用PHP?您可以看到Apache的图像,其中显示在“URI已更改”上,循环再次开始<代码>重写规则
是重写请求的指令。你也可以使用PHP,通过查看和提供适当的内容也可以这样做。我还没有尝试过这个标志,但这可能是为了你的目的。好的,然后我会将每个请求指向一个PHP文件并控制那里的所有内容,并使用.htaccess使链接SEO友好。