以前的「Nginx + FastCGI + Trac」提到給的範例是把 Trac 裝在 /
下的方法。如果是裝在 /trac
或是其他路徑時就需要修改了。
一開始試著改會出現這樣的錯誤:
No handler matched request to /trac/report/7
然後研究調整後,發現 Trac 純粹是吃 FastCGI 給的參數去判斷要怎麼處理 url routing,在 trac.ini
內 url 相關參數主要還是用在其他地方... (像是信件通知時用的 url)
首先是把檔案簡化,這是 2016 年寫的:
location / { auth_basic "trac realm"; auth_basic_user_file /srv/domain.example.com/.htpasswd; include fastcgi.conf; fastcgi_param AUTH_USER $remote_user; fastcgi_param HTTPS on; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REMOTE_USER $remote_user; fastcgi_param SCRIPT_NAME ""; fastcgi_pass unix:/var/run/trac/trac.sock; }
發現現在 fastcgi.conf 內都會處理 HTTPS
了,所以拿掉 HTTPS
的處理,然後把 location
的判斷改用 regex 去抓 /trac
後的東西,所以先變成這樣:
location ~ /trac(/.*) { auth_basic "trac realm"; auth_basic_user_file /srv/domain.example.com/.htpasswd; include fastcgi.conf; fastcgi_param AUTH_USER $remote_user; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REMOTE_USER $remote_user; fastcgi_param SCRIPT_NAME ""; fastcgi_pass unix:/var/run/trac/trac.sock; }
最後是把 PATH_INFO
改傳 $1
(在 /
的情境下 $fastcgi_script_name
剛好就會是 routing 用的 PATH_INFO
資訊,所以當時直接拿來用),把 SCRIPT_NAME
改成 /trac
。
也就是跟 Trac 說基底在 /trac
,後面的路徑才是你的 routing engine 要處理的東西,所以變成:
location ~ /trac(/.*) { auth_basic "trac realm"; auth_basic_user_file /srv/domain.example.com/.htpasswd; include fastcgi.conf; fastcgi_param AUTH_USER $remote_user; fastcgi_param PATH_INFO $1; fastcgi_param REMOTE_USER $remote_user; fastcgi_param SCRIPT_NAME "/trac"; fastcgi_pass unix:/var/run/trac/trac.sock; }
沒寫下來就會花不少時間重新摸...