【发布时间】: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文件,然后使用自定义PageController在index.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