Nginx 位置覆蓋沒有做我想要的,歡迎提出意見
我有一個 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; }
我不確定重寫正則表達式是否經過優化,但它具有實際完成工作的出色特性。