如何让NGINX在自定义PHP应用程序上正确重写和执行?

时间:2017-07-28 15:56:39

标签: php nginx

我们有一个自定义PHP应用程序,我们使用.htaccess文件在Apache上运行并运行以处理URL重写。我们正在尝试将其转换为在Plesk Onyx下使用FPM在NGINX下工作。

应用程序生成如下链接:

https://somedomain.com/mypage   (same as index/mypage)
https://somedomain.com/index/sitemap
https://somedomain.com/blog/some-article-name

这些URL映射到index.php文件,这些文件接受request_uri并使用它来呈现页面响应。

应用程序的结构嵌套如下:

docroot (/)

 ./index.php //handler for the request in /

 ./blog/index.php //handler for any request to /blog

每个index.php都希望收到一个?path = {request_uri},以便它可以将请求映射到控制器和操作。

我尝试了多种方法让NGINX使用tryfiles和重写来做到这一点,但没有运气。使用重写我可以/可以工作,但它不会渲染/ mypage或/ index / sitemap。

如果我尝试点击/ index / sitemap,它会下载index.php而不是执行它,如果我尝试博客,则会发生同样的事情。实际上唯一有效的路径是/,所有其他路径只需下载index.php文件。

这是我现在的配置,我哪里错了?

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control “public”;
    try_files $uri @fallback;
}

location / {
    #index index.php index.html index.html;
    rewrite ^/([^?]*) /index.php?path=$1 break;
    rewrite ^blog/([^?]*) /blog/index.php?path=$1 break;
    #try_files $uri @fallback;

}    

1 个答案:

答案 0 :(得分:1)

您的配置有多个问题。我将忽略第一个location块,因为它似乎与您的问题无关。

第一个rewrite将始终匹配,因此永远不会查询第二个rewrite。第二个rewrite永远不会匹配,因为nginx URI始终以/开头。 [^?]没有意义,因为rewrite使用的规范化URI不包含?或查询字符串。使用rewrite...break意味着重写的URI在同一位置处理,这是一个错误,因为此位置无法处理PHP文件。有关详情,请参阅this document

使用try_files的解决方案可能如下所示:

location / {
    try_files $uri $uri/ /index.php?path=$uri&$args;
}
location /blog {
    try_files $uri $uri/ /blog/index.php?path=$uri&$args;
}
location ~ \.php$ { ... }

有关详情,请参阅this document