很难弄清楚这一点。我已将我的网站从另一个平台更改为 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
请注意,上述设置也在文档中。