【问题标题】:Nginx rewrite directory and exclude a subdirectoryNginx 重写目录并排除子目录
【发布时间】:2021-03-10 17:32:40
【问题描述】:

这是我当前的 nginx 配置文件。

server {
    listen 6063;

    root /var/www/html/project;
    index index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm-backend.sock;
    }    

    rewrite ^/admin/(.*)$ /admin/index.php break;
}

对 /admin 的任何访问都将重写为 /admin/index.php。

现在由于某些原因,我必须将 css 文件夹、js 文件夹添加到 /var/www/html/project/admin/includes。

所以新的要求是任何对 /admin/includes/* 的访问都将访问 css 和 js 的真实文件。所有其他访问 /admin/*(不是 /admin/includes)将重写为 /admin/index.php。

或者我可以说如果不存在文件夹 /admin 的任何访问权限(例如 /admin/includes/css/example.css),然后重写为 /admin/index.php

谢谢,

【问题讨论】:

  • nginx 文档中有一个关于此的部分。 nginx.com/blog/creating-nginx-rewrite-rules你读过吗?从中产生了哪些尝试?
  • 欲了解更多具体细节:nginx.org/en/docs/http/ngx_http_rewrite_module.html 明确地说,当我阅读您的问题时,我不知道该怎么做 - 或者在哪里可以找到此信息。我明天再来;如果没有答案,你仍然卡住,我会尝试直接回答。
  • 欢迎来到 SO!为了发布问题,您应该携带最少的信息作为输入样本和预期的输出样本(如果需要),您尝试了什么以及您的研究,以显示一些努力,因为 SO 不是免费的编码服务。您尝试和研究了什么?
  • 是的,我完全同意。但是在找到答案后,我确实在下面发布了我的解决方案。而且我认为我提供了有关我的问题的足够信息。

标签: php nginx url-rewriting subdirectory fastcgi


【解决方案1】:

Nginx 使用最长匹配位置(see docs),所以给出更具体的位置指令就足够了:

server {
    …

    location ~ /admin/css {
    }

    location ~ /admin {
       rewrite (.*)$ /admin/index.php last;
    }
}

然后,如果有任何匹配 /admin/css,它将只处理空块(因此默认提供服务),所有匹配 /admin(而不是 /admin/css)的都将被重写。

【讨论】:

    【解决方案2】:

    好的,我找到了答案。

    location /admin {
        if (!-e $request_filename) {
            rewrite (.*)$ /admin/index.php last;
        }
    }
    

    如果对不存在的文件夹 /admin 的任何访问(它不是像 css 或 js 文件这样的真实文件)将重写到 /admin/index.php。

    【讨论】:

    • 始终避免在 nginx 上使用 if,而是使用单独的位置 nginx.com/resources/wiki/start/topics/depth/ifisevil
    • 是的,你说的是对的。但正如我提到的“现在由于某些原因,我必须将 css 文件夹、js 文件夹添加到 /var/www/html/project/admin/includes。”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多