我们有一个自定义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;
}
答案 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。