我正在尝试将子目录重定向到 php 文件。它不提供文件,而是下载它,这意味着它不会将其读取为 php 文件。
更确切地说,它没有进入 fastcgilocation ~ \.php$
指令。
一些有趣的事实:
- 对于集团来说一切都运行良好,
admin
但对于login
区块链来说却并非如此。 - 当我将指令移到我更改为的指令
location ~ \.php$
上方时,除了重写规则外,它仍然有效。login
^~ /login
~ /login
rewrite ^/login/(.+\.php)$ /$1 last;
我确实阅读了有关该主题的 Wiki Nginx 文档,因此我知道 nginx 读取位置指令的优先级,但这并没有告诉我如何处理这种情况!我还阅读了
- 类似的问题https://stackoverflow.com/questions/10126117/need-help-understanding-configuring-an-nginx-location-directive(未回答)
- https://stackoverflow.com/questions/11961323/howto-setup-window-nginx-virtual-directory-with-php-support我尝试过但没有成功
- https://stackoverflow.com/questions/1011101/nginx-location-directive-doesnt-seem-to-be-working-am-i-missing-something涵盖真实(非虚拟)子文件夹的情况。
配置如下:
server {
listen 80;
server_name tyba-one.com *.tyba-one.com;
root /var/www/tyba/public_html;
rewrite_log on;
error_page 404 /404.php;
client_max_body_size 4M;
if ($host ~* ^www\.(.*)){
set $host_without_www $1;
rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
}
location = / {
rewrite ^/$ /index.php last;
}
location ^~ /login {
rewrite ^(/login)$ $1/ permanent;
rewrite ^/login/$ /login.php last;
rewrite ^/login/(.+\.php)$ /$1 last;
}
location ^~ /admin {
rewrite ^(/admin)$ $1/ permanent;
rewrite ^/admin/$ /page_builder.php last;
rewrite ^/admin/(.+\.php)$ /$1 last;
}
location ~ \.php$ {
try_files $uri =404;
include /opt/nginx/conf/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/tyba/public_html$fastcgi_script_name;
}
}
我想了解发生了什么以及如何处理这种情况。
答案1
nginx 在每个嵌套级别仅处理一个位置块,因此由块而不是块/login.php
处理。由于您的位置块中只有重写语句,因此您实际上根本不需要位置块(只要重写匹配足够具体,您的重写匹配就是如此)。只需将您的重写语句移动到块的根目录中,以便请求和仍然使用位置块:^~ /login
~ \.php$
server
/login
/admin
\.php$
rewrite ^/$ /index.php last;
rewrite ^(/login)$ $1/ permanent;
rewrite ^/login/$ /login.php last;
rewrite ^/login/(.+\.php)$ /$1 last;
rewrite ^(/admin)$ $1/ permanent;
rewrite ^/admin/$ /page_builder.php last;
rewrite ^/admin/(.+\.php)$ /$1 last;
location ~ \.php$ {
...
}
答案2
mgorven 的回答解决了我的问题,我非常感激,我想回复,但我没有发言权,所以我将在这里回复并更新,虽然这个问题是在 8 年前在 2021 年提出并回答的,但我已经为这个问题绞尽脑汁好几天了
我有一个使用 HideMyWordPress 插件隐藏/保护的 Wordpress 实例 - 我从另一台 apache2 服务器移植了该实例,并与 apache 重写完美配合 - 但我是 nginx 新手 - mgorven 非常有帮助的回复不仅解决了我的问题,而且真正解释了我在所有挖掘过程中完全错过的一件事..关于位置块与重写 - 我现在正在浏览我已移动的所有网站,看看是否可以大大简化我的 nginx 配置
再次抱歉,我用“答案”而不是评论来回复,但是
即使是在 2021 年,这也是非常有用的信息,救了我一命
谢谢