我正在尝试使用重写模式编写我的 nginx conf,但目前它只能下载文件而不是使用 PHP 运行它。
我的目标是将所有内容重写到同一个文件,但使用不同的查询参数:
# If file exist (like images, assets, etc...), just use it
http://foo.local/css/style.css => css/style.css
http://foo.local/images/img.png => images/img.png
# For all other:
http://foo.local/foo => web/index.php?module=foo
http://foo.local/foo/bar => web/index.php?module=foo&action=bar
http://foo.local/foo/bar/baz => web/index.php?module=foo&action=bar¶ms=baz
server {
listen 80;
server_name foo.local;
root /var/www/foo;
index index.php
location / {
try_files $uri $uri/ @rules;
}
location @rules {
rewrite ^/([^/]*)$ /web/index.php?module=$1 break;
rewrite ^/([^/]+)/([^/]+)/?$ /web/index.php?module=$1&action=$2 break;
rewrite ^/([^/]+)/([^/]+)/([^/]+)/?$ /web/index.php?module=$1&action=$2¶ms=$3 break;
}
location /web/index\.php(/|$) {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 4k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
当我去http://foo.local/foo/bar/baz它只是下载我的index.php
你能帮我吗?谢谢
答案1
尝试在您的指令中使用rewrite ... last;
而不是。意味着 nginx 开始搜索与改变的 URI 匹配的新位置,这意味着 nginx 应该找到您的位置。break;
last
/web/index...
此外:
location /web/index\.php(/|$)
可能不会达到您的预期。location
默认情况下,块是前缀匹配,因此该位置仅匹配
/web/index\.php(/|$)...
字面上的前缀,以及带有此前缀的任何内容。
最有可能的是,你想要一个正则表达式匹配,它将是:
location ~ /web/index\.php(/|$)
另一种选择是使用正确的前缀匹配:
location /web/index.php