Nginx

Nginx 位置覆蓋沒有做我想要的,歡迎提出意見

  • July 31, 2013

我有一個 Nginx 配置文件,它適用於除一項功能之外的所有內容。我已經安裝了一個 Mediawiki,除了顯示圖片(載入它們工作正常)外,它工作得很好。

鑑於(很抱歉閹割了正確的連結,該網站說我沒有足夠的代表來寫它們)

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

導致 404 錯誤,

www.domain.tld/wiki/index.php?title=文件: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;
   }

我必須保持說/位置包括 index.php 呼叫,因為它管理其他網路應用程序。如您所見,我還添加了一些有用的調試 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

我的問題第一部分的答案很簡單:

我不應該使用:

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

實際網址

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;
   }

我不確定重寫正則表達式是否經過優化,但它具有實際完成工作的出色特性。

引用自:https://serverfault.com/questions/527543