【问题标题】:Confused about rewrite rules in NGINX对 NGINX 中的重写规则感到困惑
【发布时间】:2021-09-11 02:12:08
【问题描述】:

我正在移动一个项目以将 Docker 与 Nginx 一起使用,而 Nginx 之前使用的是 Apache。这是一个简单的 PHP 项目,但我无法像在 Apache 上那样进行重写。老.htaccess很简单;

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1 [L,QSA]

它将所有页面请求重定向到带有page参数的index.php文件,然后使用自定义PageControllerindex.php中解析。但是我不能让它与 Nginx 重写一起工作,这让我很困惑。

目标是将index.php?page=forgot_password 等URL 重写为forgot_password

我当前的 nginx.conf 是

server {
    listen 80 default_server;
    root /app/app;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

这显然行不通,因为没有重写规则。

我尝试了一些其他配置,例如Symfony documentation中的Nginx配置,它将所有页面重定向到index.php,但不提供page查询参数。

我尝试过其他配置,例如

location ~ \.php$ {
    fastcgi_pass php:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

location / {
   if (!-e $request_filename){
     rewrite ^(.+)$ /index.php?page=$1 break;
   }
}

这会导致 Firefox 提示我下载 forgot_password 文件。

我进行过其他尝试(遗憾的是我记不起了),它们似乎确实按我想要的方式工作,但导致 JS、CSS 和其他资源不再工作。

我怎样才能让它工作?我觉得我错过了一些简单的东西。

【问题讨论】:

  • Nginx 使用try 指令而不是“文件存在”。因此,使用standard WordPress setup,Nginx 会按字面意思尝试 URL(静态内容),然后尝试带有斜杠的 URL(检查文件夹),然后返回到 index.php 并传递$args。这有效地与默认的 htaccess 版本一对一地映射
  • Wordpress 示例(经过一些修改)以重写 URL 的方式工作,但 $args 仍未通过,因此显示了错误的页面,我不明白为什么。在我的php.ini 中也将cgi.fix_pathinfo 设置为0,仍然没有。
  • 我链接的几乎是官方配置,甚至 WP 的主要文档也推荐它,所以我从那里开始。如果您还没有 WP-CLI,我会抓住它并运行 wp rewrite flush,以确保没有任何内容被缓存。 (这与点击保存永久链接相同,只是有时更容易。)确保你也有 fastcgi 的东西

标签: php nginx url-rewriting


【解决方案1】:

对于 nginx 的配置,可以重写索引如下:

location / {
  if (!-e $request_filename){
    rewrite ^(.+)$ /index.php?page=$1 break;
  }
}

或者:

server {
    server_name yourdomain.com;
    location ~ "^/(.+)$" {
        try_files $uri $uri/ /index.php?page=$1;
    }
}

【讨论】:

  • 我仍然很困惑,这两个选项都不能单独工作,它们都会导致 Firefox 提示我下载文件。
  • 其他浏览器怎么样 - 比如 chrome ? (我问这个是因为我怀疑你的firefox可能有问题?请尝试清除缓存或重新安装)
  • Chrome 也是如此,我真的很困惑。这是我当前的 nginx.conf 文件; pastebin.com/kcUE2wRn
  • 只是想知道 - 你是否在更改配置文件后重新启动了 ngnix?
  • 每次更改后我都会停止和启动 docker 容器,并且更改会在不同尝试之间生效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2013-08-29
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多