【问题标题】:.htaccess - rewrite anything else to index.php.htaccess - 将任何其他内容重写为 index.php
【发布时间】:2013-08-16 06:26:03
【问题描述】:

我的项目中有 apppublic 文件夹。我希望以 (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,不应该这样。如果我删除第三行,第二行也开始工作(这意味着它本身是正确的)。

这太简单了,但我在这三行中找不到错误。请帮忙。

【问题讨论】:

    标签: apache .htaccess nginx apache2


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我忘记了 apache 配置中的“递归”(这是与 nginx 的区别)。替代解决方案是添加第三行类似的内容:RewriteRule ^public\/ - [L].
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多