Nginx 位置覆盖不能满足我的要求,欢迎提出意见

Nginx 位置覆盖不能满足我的要求,欢迎提出意见

我有一个 Nginx 配置文件,除了一个功能外,其他功能都适用。我安装了 Mediawiki,除了显示图片外,它运行良好(加载图片时可以正常工作)。

而(抱歉阉割了正确的链接,网站说我没有足够的声誉来写它们)

www.domain.tld/wiki/File:Rosa_grande.jpg

导致 404 错误,

www.domain.tld/wiki/index.php?title=File:Rosa_grande.jpg

工作正常。

于是我开始深入研究 Nginx 配置,并注意到“/”位置如何优先于图像位置。出现 404 错误是因为我尚未在根目录中安装 index.php 文件(目前)。

具体来说,给定一个位于以下位置的文件:

/wiki/images/7/78/Rosa_grande.jpg

我已经手动创建了一个应该抛出(仅用于调试目的!)错误 500 的位置:

location /wiki/images/.*\.(js|css|png|jpg|jpeg|gif|ico)$ {
more_set_headers 'Location 6';

return 500;
}

正则表达式解析得很好http://www.regexplanet.com/advanced/java/index.html并且确实与“jpg”匹配。

我也尝试放置 ^~ /wiki/images/.... 但没有结果。

进入该位置的所有尝试都会被该其他位置覆盖:

    location / {
            more_set_headers 'Location 10';
            try_files $uri $uri/ /index.php?q=$uri&$args =404;
    }

    location ~ \.php$ {
            more_set_headers 'Location 20';
            try_files $uri =404; # This is not needed if you have cgi.fix_pathinfo = 0 in php.ini (you should!)

            include include/php_fpm_pass.conf;
    }

我必须保留上述 /location,包括 index.php 调用,因为它管理其他 Web 应用程序。如您所见,我还添加了一些有用的调试 more_set_headers 语句来显示正在处理的实际位置。

键入:

curl -I http://127.0.0.1:8080/wiki/images/7/78/Rosa_grande.jpg

应显示错误 500(/wiki/images 位置命中)并且标题应显示“位置 6”

但它却显示 404 和位置 10。

HTTP/1.1 404 Not Found
Server: nginx
Date: Wed, 31 Jul 2013 09:16:01 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: 10

如果我将 Rosa_grande.jpg 文件放到位,我会收到“200 OK”消息,并且仍然位于位置 10:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 31 Jul 2013 09:09:02 GMT
Content-Type: image/jpeg
Content-Length: 19735
Last-Modified: Tue, 30 Jul 2013 09:50:15 GMT
Connection: keep-alive
ETag: "51f78c57-4d17"
Location: 10
Accept-Ranges: bytes

答案1

我的问题第一部分的答案很简单:

我不应该使用:

location /wiki/images/.*\.(js|css|png|jpg|jpeg|gif|ico)$ {

location ~* /wiki/images/.*\.(png|jpg|jpeg|gif|ico)$ {

因为只有后者才会真正处理“/”“catch all”之前的正则表达式。

接下来是第二阶段:

转换 Mediawiki “漂亮的 URL” 如下:

www.domain.tld/wiki/File:Rosa_grande.jpg

变成

www.domain.tld/wiki/index.php?title=File:Rosa_grande.jpg

称呼。

事实上,我没有发现任何“明显”的映射

File:Rosa_grande.jpg

实际的 URL

wiki/images/7/78/Rosa_grande.jpg

因为我错过了一种方法来找出 File:Rosa_grande.jpg 映射到存储在“/7/78/”子目录中的文件。

不用说,所有其他 Mediawiki 模块都可以完美地与“漂亮的 URL”配合使用,甚至包括那些除了“/wiki/File:Something”之外的“/wiki/Action:Something”URL。

解决方案最终相当简单:重写正确的“丑陋”URL:

    location ~* ^/wiki/File:(.*\.(png|jpg|jpeg|gif|ico))$ {
            # more_set_headers 'Location 1.7: /wiki/File';
            rewrite ^/wiki/File:(.*\.(png|jpg|jpeg|gif|ico))$ /wiki/index.php?title=File:$1 last;
    }

我不确定重写正则表达式是否经过优化,但它确实具有完成工作的出色特性。

相关内容