Nginx config:通过索引路由所有.php文件,除非它包含文件管理器的路径

时间:2018-04-10 08:23:42

标签: php nginx server nginx-config

我正在开发新项目,该项目将有来自旧网站uris的许多重定向。许多旧uris在.php中包含uri扩展名,Nginx尝试将它们作为文件加载,而不是回退到我们的重定向控制器方法。

为了使它变得有点棘手,我们使用了文件管理器的wysiwyg编辑器,当被调用时 - 使用.php扩展名,因此需要将其排除在外。

有效地,我希望它能够正常工作,以便当我呼叫uri之类的旧/old-page/path/file.php时,它会通过index.php进行路由,但是当我呼叫{{1}时它将加载实际文件。

我已经看过这篇文章,它并没有真正解决我之后的问题,但我认为这是一个很好的起点How to remove both .php and .html extensions from url using NGINX?

我现有的设置是

/vendor/ckfinder/plugins/filemanager/dialog.php?...

非常感谢任何帮助。

更新

我尝试了@Richard Smith的建议,在阅读了我认为应该有用的文档之后,但不幸的是,无论出于何种原因 - 它不是 - 这就是我尝试的内容:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

因此location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri /index.php?$query_string; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; include fastcgi_params; } 会检查try_files是否存在 - 如果它不存在,则会回退到$uri,这应该将请求指向/index.php?$query_string;。知道我在这里可能缺少什么吗?

1 个答案:

答案 0 :(得分:1)

如果新服务器上不存在PHP文件,最简单的解决方案是将任何不存在的PHP文件重定向到/index.php - 就像对非PHP URI一样。

例如:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
    try_files $uri /index.php?$query_string;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    include fastcgi_params;
}

fastcgi_split_path_infofastcgi_index语句,在此特定location块中不需要。

有关详情,请参阅this document