Nginx中的定位块未获得预期的结果-可能是订购吗?

时间:2019-01-09 17:49:36

标签: nginx

我有一个使用nginx的网站,其中包含大量重定向,以保留旧的反向链接为我提供的功能和用户界面,但它们并不能完全按我的需要工作。我怀疑这可能是订购问题,但我不确定,因此希望获得一些帮助。

我敢肯定我已经快到了,但是我想不出办法让它们一起工作!

location / {
    try_files $uri $uri/ @extensionless-php;
}

location @redirector {
    rewrite ^(.*)$ /redirection-check/?request=$request_uri;
}

location @extensionless-php {
    rewrite ^(.*?)/?$ $1.php;
}

location ~ ^([^.\?]*[^/])$ {
    try_files $uri @addslash;
}

location @addslash {
    return 301 $uri/;
}

location ~ \.php$ {
    try_files $uri $uri/ @redirector;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php5.6-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
}

它应该工作的方式是...

  1. 如果有人登陆domain.com/page或domain.com/page.php,则301到domain.com/page /
  2. 将domain.com/page/解释为domain.com/page.php
  3. 如果domain.com/page.php不存在,请转到domain.com/redirection-check/?request=the404request。这是一个301/404处理程序,在大型php数组中具有大量旧网址,因此它们未在nginx配置文件中全部列出。

1 个答案:

答案 0 :(得分:0)

您有一个<Table Name Here>块来处理以location ~ \.php$结尾的URI。这将同时处理内部重写的URI(由您的.php块生成)和外部显示的URI(例如您的第一个要求)。

要以不同方式处理外部提供的URI,您需要查看原始请求,该请求可以作为@extensionless-php使用。

$request_uri包含原始请求,包括可选查询字符串,可以使用$request_urimap指令进行测试。

例如:

if

有关if ($request_uri ~ ^(.*)\.php(\?|$)) { return 301 $1/; } 的使用,请参见this caution