我试图在 nginx 中重写为 PHP 文件而不更改 URL,但是 php-fpm 没有处理该文件,我得到的只是 500。
如果我删除重写并直接访问该文件,它可以工作,所以.php 文件没有错误。
server {
listen 80;
root /var/www/example.com/public_html;
server_name example.com www.example.com;
index index.html index.php;
add_header Access-Control-Allow-Origin *;
location ~ ^/InfoCenter/api/.*$ {
rewrite "/InfoCenter/api/(.*)" /InfoCenter/api/index.php last;
}
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;
}
location ~/\.htaccess {
deny all;
}
}
答案1
您的信息中心位置也会捕获您正在重写的位置,因为它再次与正则表达式匹配。即,您的用户将被重写/InfoCenter/api/index.php
,然后被卡在同一位置。然后永远不会发送到 PHP。
尝试将 PHP 位置更改为:
位置 ^~ .*\.php$ { ... }
将位置更改为正则表达式前缀将使其优先于其他位置。
答案2
您不需要在/InfoCenter/api
位置中使用正则表达式。您可以使用:
location /InfoCenter/api {
try_files /InfoCenter/api/index.php;
}
这样就可以避免/InfoCenter
再次匹配路径的问题。前缀匹配也比正则表达式匹配稍微快一些。
此外,try_files
这是一种更简单的方法,可以将所有带有该前缀的请求转发到文件index.php
。它实际上也不会重写 URL,这是您原始方法中存在的问题的一部分。