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