Apache .htaccess-将其他内容重写为index.php

Apache .htaccess-将其他内容重写为index.php,apache,.htaccess,nginx,apache2,Apache,.htaccess,Nginx,Apache2,我的项目中有app和public文件夹。我希望将以(css | im | js | lib)/开头的路径重定向到公共文件夹,并将其他任何内容重定向到index.php文件 例如,应该重定向到SITE_ROOT/public/css/s.css,并且应该重定向到SITE_ROOT/index.php 以下是nginx的工作配置: server { listen 80; server_name mysite.com; root /home/mysite/html; location

我的项目中有apppublic文件夹。我希望将以(css | im | js | lib)/开头的路径重定向到公共文件夹,并将其他任何内容重定向到index.php文件

例如,应该重定向到SITE_ROOT/public/css/s.css,并且应该重定向到SITE_ROOT/index.php

以下是nginx的工作配置:

server {
  listen 80;
  server_name mysite.com;
  root /home/mysite/html;

  location ~ \/(css|im|js|lib)\/ {
    root /home/mysite/html/public;
    expires 30;
    try_files $uri =404;
  }

  location {
    rewrite ^(.*)$ /index.php break;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}
现在我试着为apache重写它,我在.htaccess中写了类似的内容:

RewriteEngine On
RewriteRule ^(css|im|js|lib)\/(.*)$ public/$1/$2 [L]
RewriteRule . index.php [L]
这是行不通的。这似乎是一条规则。index.php应用于第二行之前,以便所有内容都转到index.php。但是为什么呢

如果我将第三行更改为

RewriteRule ^(.*)$ index.php [L]
这意味着方程的类型不会影响规则的顺序

只有当我从第二行的正则表达式中删除^symbol时,站点才能按预期工作。但我不想移除它!现在重写为css/s.css,不应该是这样。如果我删除第三行,第二行也会开始工作(这意味着它本身是正确的)


这太简单了,但我在这三排中找不到错误。请提供帮助。

问题在于,内部重定向被视为新请求,因此将再次评估规则,其中第一个规则现在不再匹配,但第二个规则匹配,因此您将始终位于
index.php

避免这种情况的一种方法是将最后一条规则绑定到它不以
/public/
开头的条件:

RewriteCond %{REQUEST_URI} !^/public/.*
RewriteRule . index.php [L]

非常感谢。我忘记了apache配置中的“递归”(这是与nginx的区别)。另一种解决方案是添加第三行类似的内容:RewriteRule^public\/-[L]。