我的项目中有 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,它不应该那样。如果我删除第三行(这意味着它本身是正确的),第二行也会开始工作。
那简单愚蠢,但我找不到这三行的错误。请帮忙。
答案 0 :(得分:1)
问题在于内部重定向被视为新请求,因此规则再次被评估,第一条规则现在不再匹配,但第二条规则不再匹配,所以你总是会在index.php
。
避免这种情况的一种方法是将最后一条规则绑定到不以/public/
开头的条件:
RewriteCond %{REQUEST_URI} !^/public/.*
RewriteRule . index.php [L]