Nginx 将旧的 PHP URL 视为文件

Nginx 将旧的 PHP URL 视为文件

很难弄清楚这一点。我已将我的网站从另一个平台更改为 Joomla,现在 Nginx 无法处理旧 URL。

我的旧网址如下:

example.com/home.php
example.com/contact-us.php

我的新 Joomla SEF URL 如下:

example.com/home
example.com/contact-us

根据 Joomla 指南,我有以下 Nginx 配置:

 location / {             
              try_files     $uri $uri/ /index.php?$args;
        }

 # Process PHP
 location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;

            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
 }

我希望 Nginx 将这些旧 URL 传递给 Joomla 来处理。现在,发生的事情是,Nginx 将这些旧 URL 视为 php 文件,然后向我显示此No input file specified.错误。然后我将 php 块内的 try_files 更改为,try_files $uri /index.php?$args;因此我的 Nginx 配置如下所示:

 location / {             
              try_files     $uri $uri/ /index.php?$args;
        }

 # Process PHP
 location ~ \.php$ {
            try_files       $uri /index.php?$args;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;

            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
 }

这是有效的吗?在某些情况下这会导致无限循环问题吗?这是正确的做法吗?我没有找到任何类似的解决方案。有人可以指导我吗?

答案1

location /从未使用过

您遇到的问题与位置优先(强调添加)。

nginx 首先搜索由文字字符串给出的最具体的前缀位置,而不管列出的顺序如何。[...] 然后 nginx 按照配置文件中列出的顺序检查由正则表达式给出的位置。第一个匹配的表达式停止搜索nginx 将使用此位置。如果没有正则表达式与请求匹配,则 nginx 使用先前找到的最具体的前缀位置。

因此,此位置块:

location ~ \.php$ {
    try_files $uri =404; # <-

匹配此请求:

example.com/home.php

并且没有其他位置块相关。

正如您已经意识到的,这意味着 nginx 将尝试查找并提供服务,home.php结果导致 404。

使用 @location 作为主 index.php 文件

通常唯一相关的 php 文件是index.php,您可以像这样使用它:

try_files $uri $uri/ @joomla;

location @joomla {
    include fastcgi_params;
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_param   SCRIPT_FILENAME     $document_root/index.php;
    fastcgi_param   SCRIPT_NAME         $document_root/index.php;
    fastcgi_param   DOCUMENT_URI        /index.php;
    fastcgi_index   index.php;
}

对 *.php 请求使用另一个位置块

除了前端控制器之外,joomla 还允许/期望直接访问其他 php 文件,例如/administrator/index.php。要允许访问它们而不尝试处理丢失的 php 文件,请执行以下操作:

location ~ \.php$ {
    try_files $uri @joomla;

    include fastcgi_params;
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

这将允许直接访问其他 php 文件(通常不是一件好事...),对于任何不存在的 php 文件请求,/index.php通过位置重新使用。@joomla

请注意,上述设置也在文档中

相关内容