Django+nginx+靜態網站

海上华帆發表於2024-06-30

問題

  • 我用ubuntu系統ip:192.168.2.101,安裝nginx作為伺服器。有hugo生成的靜態網站,nginx設定監聽1313埠,用瀏覽器地址http://192.168.2.101:1313是可以正常訪問這個靜態網站的。同時系統內安裝了django專案,django專案用瀏覽器地址http://192.168.2.101也是可以正常訪問的。現在有一個需求,假如django模板檔案中需要做一個連結,點選後可以直接轉入到靜態網站的地址http://192.168.2.101:1313的,這個連結怎麼做?是否還需要其他設定?
  • 因為使用proxy_pass只是返回http://127.0.0.1:1313/的內容,而且返回的內容容易出錯,沒有靜態檔案。實際的訪問地址也並未改變,因此我想要的效果是點選連結後,是出現直接的地址跳轉,如何才能實現?

因為使用proxy_pass只是返回http://127.0.0.1:1313/的內容,而且返回的內容容易出錯,沒有靜態檔案。因此我想要的效果是點選連結後,是出現直接的地址跳轉,如何才能實現?

為了實現點選連結後直接跳轉到指定的地址,而不是透過 Nginx 代理,你可以簡單地在 Django 模板中使用絕對 URL 連結。這種方法非常直接,並且不會涉及到任何代理設定。

以下是一些具體的實現方式:

  1. 直接在 Django 模板中使用絕對 URL
    你可以在 Django 模板中直接編寫一個連結,指向你靜態網站的地址。

    <a href="http://192.168.2.101:1313" target="_blank">訪問靜態網站</a>
    

    這將使使用者點選連結後,瀏覽器直接跳轉到 http://192.168.2.101:1313

  2. 使用 Django 的 url 模板標籤(如果你想在 URL 中使用動態部分):
    如果你希望連結在 Django 中更靈活,可以在 urls.py 中定義一個檢視,該檢視只做一個簡單的重定向:

    你的 urls.py 中
    from django.urls import path
    from django.views.generic import RedirectView
    
    urlpatterns = [
        # 其他 URL 模式
        path('redirect-to-hugo/', RedirectView.as_view(url='http://192.168.2.101:1313'), name='redirect-to-hugo'),
    ]
    

    然後在你的模板中使用這個 URL:

    <a href="{% url 'redirect-to-hugo' %}" target="_blank">訪問靜態網站</a>
    
  3. 配置 Nginx 進行重定向
    如果你希望透過 Nginx 實現重定向,而不是內容代理,可以使用 return 指令:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/home/lyh/aipw/aipw.sock;
        }
    
        location /stack/ {
            return 301 http://192.168.2.101:1313/;
        }
    }
    

    這種方式會在使用者訪問 http://example.com/hugo/ 時,直接重定向到 http://192.168.2.101:1313/,並在瀏覽器位址列中顯示新的 URL。

透過以上方法,你可以實現點選連結後直接跳轉到指定的地址,而不是透過 Nginx 代理內容。

相關文章