经过几个小时的尝试、搜索和研究后,我最终决定在这里提问。
几个月前,我将我的网站迁移到了较新的版本,并且在 Apache 中的旧托管上一切都运行正常。
最近我迁移到 VPS,我决定使用 Nginx 作为服务器,并且正在处理细节。
我的问题是我正在尝试使用 PHP 脚本进行一些特定的重定向。
重定向在 apache 中(本地和远程)运行良好,但在 nginx 中却不行。
奇怪的行为是,例如当我尝试使用 URL fakesite.tk/Section/index.php 时,apache 重定向到 fakesite.tk/Section/ 但 Nginx 返回 404 错误,如果我尝试 URL fakesite.tk/Section/index.php/ 神秘地工作(请注意末尾的斜杠)并重定向到 fakesite.tk/Section//(注意双斜杠)
我尝试在所有 URL 末尾添加斜杠,但这种重定向在 Nginx 中同样不起作用。
如果重要的话,我的 VPS 在 Ubuntu 中运行(相当于我的主机)并且我在 Windows 机器上进行测试。
这是我的 Nginx 站点配置文件:
server
{
server_name *.fakesite.tk;
return 301 $scheme://www.fakesite.tk$request_uri;
}
#Redirect non www to www site version
server
{
server_name fakesite.tk;
return 301 $scheme://www.fakesite.tk$request_uri;
}
server
{
listen 80;
listen [::]:80;
root /var/www/SiteFolder;
index index.php;
server_name www.fakesite.tk;
#Stabilishing error 404 and 403 error pages
error_page 404 /?error=404;
error_page 403 /?error=403;
#Friendly URLs
location /
{
location /
{
try_files $uri $uri/ =404;
rewrite ^/([^/]*)/$ /?sect=$1 last;
rewrite ^/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2 last;
rewrite ^/([^/]*)/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2&cont=$3 last;
rewrite ^/([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /?sect=$1&lang=$2&cont=$3&subcont=$4 last;
}
#Adding expire header
location ~* \.(?:ico|css|js|gif|jpe?g|png|eot|svg|ttf|woff)$
{
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
}
#Enabling PHP
location ~ \.php$
{
# With php5-fpm:
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
# fastcgi_index index.php;
include fastcgi_params;
}
#deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht
{
deny all;
}
}
我的 php 重定向脚本:
<?php
ini_set('display_errors', true);//Si estamos en local se muestran con normalidad los errores.
error_reporting(E_ALL);
$url = "http://$_SERVER[SERVER_NAME]$_SERVER[REQUEST_URI]";
$newurl = $url;
$newurl = str_replace('_', '-', $url);//Reeplace all _ with -
$newurl = str_replace('index.php', '', $newurl);//Removing a index.php
$newurl = str_replace('.php', '', $newurl);//Removing all .php
$newurl = str_replace('/Intro', '', $newurl);//Removing all intro sections
$extens = preg_match('/\.(jpg|gif|png|jpeg|js|css|woff|html|eot|svg|ttf|xml|map|min|txt)/', $newurl);
if($extens !== 1 && $newurl[strlen($newurl) - 1] !== '/') //Trying to put a slash at the end
{
$newurl.='/';
}
if($url !== $newurl)
{
header("HTTP/1.1 301 Moved Permanently");
header("Location: $newurl");
}
?>
我想这也许是我甚至没有注意到的很小的细节,所以我很感谢你的帮助。非常感谢。
编辑:我验证了 var $newurl 确实发生了变化并进入了 if 条件,但是这些header(....);
行并未执行,我exit();
在其后放置了一个命令并且它正在执行,这意味着实际上这些header(...);
行并未执行。
编辑 2:当我手动在 URL 中放置下划线并在其末尾放置斜线时,这会很好地重定向,但如果我没有在末尾放置斜线,即使运行条件块它也不会起作用。
答案1
好了,伙计们。我终于解决了,就像我说的,这是一个非常小的细节(小细节总是最困难的)。
问题出fcgi
在 nginx 的虚拟主机文件中配置的 PHP。
在原始文件(如下)中,我说fcgi
尝试查找文件,如果不触发404 error
,这是我的错误,因为它触发了他的自身错误并且不允许我的网站管理这个,所以重定向脚本不会被执行。
#Enabling PHP
location ~ \.php$
{
# With php5-fpm:
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
为了解决这个问题。我简单地说将fcgi
代码错误作为参数发送,以便网站管理它,就像这样:
#Enabling PHP
location ~ \.php$
{
# With php5-fpm:
#try_files $uri =404; #Mistake here!!
try_files $uri /?error=404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
编辑:我更喜欢使用正确的 nginx 虚拟主机配置文件在 URL 末尾添加尾部斜杠(以避免 404 错误),因为 PHP 无法正常工作。我只在块内添加了以下行server
:#Adding trailing slash at the end rewrite ^([^.]*[^/])$ $1/ permanent;
请注意,仅当 URL 没有点时才会重定向'.'
。
我希望将来有人可以利用这个经验来解决相关问题。
回头见。