nginx 中奇怪的 php 重定向(在 apache 中运行良好)

nginx 中奇怪的 php 重定向(在 apache 中运行良好)

经过几个小时的尝试、搜索和研究后,我最终决定在这里提问。

几个月前,我将我的网站迁移到了较新的版本,并且在 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 没有点时才会重定向'.'

我希望将来有人可以利用这个经验来解决相关问题。

回头见。

相关内容