2016-11-01 55 views
1

我想设置一个子文件夹的根文件夹,拿什么通过追加他们的根之前的目录重写每个请求的URL,像如何在.htaccess中设置一个子目录作为根目录?

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

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

当您请求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/ 

你也可以检查,如果请求的URL不public,例如启动

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

这很奇怪。我认为,如果我不重定向,它只是从重写的路径发送文件,而不是重新启动整个事情。检查重定向状态有点怪异,所以我会和第二个一起去。没有标志或什么东西只是重写响应的路径?或者,也许在没有破坏结构语义的情况下使用PHP的帮助? – Tomato

+0

您可以看到Apache的[规则集处理](https://httpd.apache.org/docs/current/rewrite/tech.html#InternalRuleset)的图像,它显示了在“URI已更改”时,循环再次开始。 'RewriteRule'是重写请求的指令。您也可以使用PHP,并通过查看['__ SERVER ['REQUEST_URI'']](http://php.net/manual/en/reserved.variables.server.php)并提供适当的内容来执行相同的操作。 –

+0

我还没有试过['END'](https://httpd.apache.org/docs/current/rewrite/flags.html#flag_end)标志,但也许这适用于您的目的。 –

相关问题