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

时间:2013-08-14 10:34:25

标签: apache .htaccess nginx apache2

我的项目中有 app public 文件夹。我希望以(css | im | js | lib)/开头的路径被重定向到公共文件夹,以及其他任何东西 - 到index.php文件。

例如,http://mysite.com/css/s.css应重定向到SITE_ROOT / public / css / s.css,http://mysite.com/absde应重定向到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]

这不起作用。看来RewriteRule。 index.php在第二行之前应用,以便所有内容都转到index.php。但为什么?

如果我将第三行更改为

,则没有任何变化
RewriteRule ^(.*)$ index.php [L]

这意味着等式的类型不会影响规则的顺序。

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

那简单愚蠢,但我找不到这三行的错误。请帮忙。

1 个答案:

答案 0 :(得分:1)

问题在于内部重定向被视为新请求,因此规则再次被评估,第一条规则现在不再匹配,但第二条规则不再匹配,所以你总是会在index.php

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

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