重写从子域提供的root访问权限

时间:2012-04-08 19:45:02

标签: apache .htaccess mod-rewrite

Options -Indexes
RewriteEngine on
Options +FollowSymLinks

RewriteRule ^$ 2012/index.php   [L]
RewriteCond %{DOCUMENT_ROOT}/2012%{REQUEST_URI} -f
RewriteRule .* 2012/$0 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* 2012/index.php$0 [QSA] #<-- this is wrong here, and gives 500 error

我正在尝试从2012子文件夹中提供所有网址。

我尝试了上面的脚本,但对于以下网址来说失败了:

index.php/admin/controller/action?id=123

应从子文件夹中解析 2012/index.php/admin/controller/action?id=123

出了什么问题?

1 个答案:

答案 0 :(得分:0)

我猜猜URI /index.php/admin/controller/action?id=123未通过%{DOCUMENT_ROOT}/2012%{REQUEST_URI}的-f测试,而是被最后一条规则:RewriteRule .* 2012/index.php?q=$0 [QSA]四舍五入,将URI转为/2012/index.php?q=index.php/admin/controller/action&id=123。你必须为此添加一个特例,因为第一个条件/规则允许现有文件按原样重写,最后一个条件/规则充当“全能”(并且第一条规则就是对于请求URI为/)的特殊情况。尝试这样的事情:

RewriteRule ^$ 2012/index.php   [L]
RewriteCond %{REQUEST_URI} ^/index\.php [OR]
RewriteCond %{DOCUMENT_ROOT}/2012%{REQUEST_URI} -f
RewriteRule .* 2012/$0 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* 2012/index.php?q=$0 [QSA]

如果以RewriteCond %{REQUEST_URI} ^/index\.php [OR]开头的请求并且URI按原样重写到/ 2012 /目录中,则将满足新条件/index.php [OR] 可确保遵循以前的直接访问条件。