我想将子文件夹设置为根文件夹,这意味着通过在根目录之前附加目录来重写每个请求的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]
但是当我请求其任何页面时,我收到内部服务器错误。
答案 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]