Apache .htaccess-将其他内容重写为index.php
我的项目中有app和public文件夹。我希望将以(css | im | js | lib)/开头的路径重定向到公共文件夹,并将其他任何内容重定向到index.php文件 例如,应该重定向到SITE_ROOT/public/css/s.css,并且应该重定向到SITE_ROOT/index.php 以下是nginx的工作配置: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
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]。