整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Nginx: 最常見的 2 中 http to https 跳轉場景



          ginx: 最常見的 2 種 http to https 跳轉場景

          建議點擊 查看原文 查看最新內容。

          原文鏈接: https://typonotes.com/posts/2023/08/28/nginx-http-https-redirect-scenarios/

          1. Nginx 上層無代理, 用戶直接訪問

          這種方式比較簡單。

          1. 我們對 http 和 https 都具有控權。
          2. 用戶是直接訪問 Nginx 服務器。

          所以可以直接通過在 http server 上配置到 301 跳轉 到 https 服務器即可。

          # http server
          server {
          listen 80;
          server_name _;
          return 301 https://$host$request_uri;
          }

          # https server
          server {
          listen 443 ssl http2;
          server_name www.example.com;

          # ... other
          }

          通常, 我個人習慣將兩個配置寫在同一個文件中。更具體的配置邏輯都放在 https server 中。

          2. Nginx 上層有代理

          這種情況, 稍微麻煩一點。

          1. 最重要的, 用戶并不直接訪問我們的 Nginx Server, 而是通過上層代理 Proxy 代理。
          2. 實際提供 HTTPS 服務的其實是上層 Proxy, 且 我們并沒有管理權限
          3. 因此, Proxy 在訪問 Nginx Server 的時候, 始終使用 HTTP 協議。

          這種情況下, 我們直接使用 Nginx 提供的 內置變量 scheme 就行不通了。

          # 錯誤配置
          server {
          listen 80;
          server_name _;

          if ($scheme = "http"){
          return 301 https://$host$request_uri;
          }
          }

          使用上述配置, 無論用戶通過任何協議請求, Nginx Server 拿到的都是 http, 即 條件恒等。結果就是永遠在跳轉, 直到重定向次數過多而報錯。

          解決方案就是 使用 Proxy 提供的 Header 進行判斷。不同的 Proxy 提供的 Header 名稱可能不一樣,需要具體分析。

          # 可用配置
          server {
          listen 80;
          server_name _;

          # ... other

          if ($http_x_forward_scheme = "http"){
          return 301 https://$host$request_uri;
          }
          }

          注意: 這里的 http_x_forward_scheme 對應的就是 請求頭 中的 X-Forward-Scheme。具體規則參考 3. Nginx 獲取 Http Header 規則

          3. Nginx 獲取 Http Header 規則

          Nginx 默認提供了獲取 HTTP Header 的方法, 參考文檔 Nginx 各種頭技巧[1]

          這里做一個總結,

          3.1 HTTP Header 轉 Nginx 變量

          默認情況下 變量名遵守以下規則:

          1. 將 Header 名稱 **所有大寫變小些, 所有 -_**,
          2. 以 http_ 開頭
          3. Header 名稱不支持 下劃線
          ## 正確
          Server-Version => http_server_version
          X-Forward-Scheme => http_x_forward_scheme
          X-Customize-Header => http_x_customize_header

          ## 錯誤
          Server_Verver (x)

          如果要支持 Header 名稱下劃線, 需要 額外開啟 語法 underscores_in_headers[2]

          Syntax: underscores_in_headers on | off;
          Default: underscores_in_headers off;
          Context: http, server
          server {
          underscores_in_headers on;
          }

          開啟之后, 即可使用。

          Server_Version => http_server_version

          3.2 Header 變量的常規操作

          1. 判斷 header 是否存在
          server {
          if ( $x_customize_header ){
          # statement
          }
          }
          1. 判斷 header 值是否預期, 參考 nginx if 語法。
          server {
          if ( $x_customize_header = "vscode-client/v1.2" ){
          # statement
          }
          }

          參考文檔

          1. Heroku Routing Header: https://devcenter.heroku.com/articles/http-routing
          2. Nginx 各種頭技巧: https://liqiang.io/post/nginx-redirect-with-request-header-3c575166
          3. Nginx配置:讀取自定義header + 撰寫AND條件 + 修改響應體 + 域名重定向: https://segmentfault.com/a/1190000020852253
          4. Nginx If-Condition: https://blog.xinac.cn/archives/nginx%E9%85%8D%E7%BD%AE%E4%B8%ADifelse%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%B3%95.html
          5. Nginx if-is-evil: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
          6. Nginx Creating-Nginx-Rewrite-Rules: https://www.nginx.com/blog/creating-nginx-rewrite-rules/
          7. Nginx 中的 If 判斷: https://www.ucloud.cn/yun/40533.html

          互相吹捧, 共同進步

          加我好友, 備注 技術群 加群一起學習 Golang, Devops, Docker/K8s

          參考資料

          [1]

          Nginx 各種頭技巧: https://liqiang.io/post/nginx-redirect-with-request-header-3c575166

          [2]

          語法 underscores_in_headers: http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers

          為開發人員,我們依賴于靜態分析工具來檢查、lint(分析)和轉換我們的代碼。我們使用這些工具來幫助我們提高生產效率并生成更好的代碼。然而,當我們使用markdown編寫內容時,可用的工具就很少。

          在本文中,我們將介紹如何開發一個Markdown擴展來解決在使用Markdown管理Django站點中的內容時遇到的挑戰。

          你認為他們有linter嗎?

          照片來自Pexels,由mali maeder拍攝

          問題

          像每個網站一樣,我們在主頁、FAQ部分和“關于”頁面等地方都有不同類型的(大部分)靜態內容。很長一段時間以來,我們都是在Django模板中直接管理這些內容的。

          當我們最終決定是時候將這些內容從模板轉移到數據庫中時,我們認為最好使用Markdown。從Markdown生成HTML更安全,它提供了一定程度的控制和一致性,并且對于非技術用戶來說更容易處理。隨著我們轉移過程的進展,我們注意到我們遺漏了一些東西:

          內部鏈接

          當URL更改時,鏈接到內部頁面的鏈接可能會中斷。在Django模板和視圖中,我們使用了reverseand {% url %},但是這在普通的Markdown中是不可用的。

          在不同環境之間進行復制

          絕對內部連接不能在不同環境之間進行復制。這可以使用相對鏈接來解決,不過目前沒有開箱即用的增強這一點的方法。

          無效鏈接

          無效鏈接會損害用戶體驗,并導致用戶質疑整個內容的可靠性。這并不是Markdown獨有的東西,只不過HTML模板是由對URL有一定了解的開發人員維護的。另一方面,Markdown文檔是為非技術寫作人員設計的。

          前期工作

          當我研究這個問題時,我搜索了Python linters、Markdown預處理器和擴展來幫助生成更好的Markdown。結果都不是很好。一個引人注目的方法是使用Django模板來生成Markdown文檔。

          使用Django模板預處理Markdown

          使用Django模板,你可以使用諸如url之類的模板標記來反向查詢URL名稱,并配合使用條件、變量、日期格式和所有其他Django模板特性。這種方法本質上是使用Django模板作為Markdown文檔的預處理程序。

          我個人認為這可能不是非技術作家的最佳解決方案。另外,我擔心提供對Django模板標記的訪問可能是危險的。

          使用 Markdown

          對這個問題有了更好的理解之后,我們準備在Python中更深入地研究Markdown。

          將Markdown轉換為HTML

          要在Python中開始使用Markdown,我們先安裝markdown包:

          接著,創建一個Markdown對象并使用其函數將一些Markdown轉換成HTML:

          你現在可以在你的模板中使用這個HTML代碼片段。

          使用Markdown擴展

          基本的Markdown處理器提供了生成HTML內容的基本要素。對于更“新奇”的選項,Python markdown包包含了一些內置擴展。一個流行的擴展是“extra”擴展,除了其他東西之外,它增加了對隔離代碼塊的支持:

          為了使用我們獨特的Django功能擴展Markdown,我們將開發自己的擴展。

          創建一個Markdown擴展來處理內聯鏈接

          如果你查看源代碼,你將看到要將markdown轉換為HTML, Markdown會使用多種不同的處理器。一種類型的處理器是內聯處理器。內聯處理器會匹配特定的內聯模式,如鏈接、反引號、粗體文本和帶下劃線的文本,并將它們轉換為HTML。

          我們的Markdown擴展的主要目的是驗證和轉換鏈接。因此,我們最感興趣的內聯處理器是LinkInlineProcessor。這個處理器以[Haki的網站](https://hakibenito.com)的形式獲取markdown ,解析它并返回一個包含鏈接和文本的元組。

          為了擴展該功能,我們擴展了LinkInlineProcessor并創建了一個Markdown.Extension, 我們用它來處理鏈接:

          我們來將這段代碼分解一下::

          • DjangoUrlExtension擴展注冊了一個名為DjangoLinkInlineProcessor的內聯鏈接處理器。這個處理器將取代任何其他現有的鏈接處理器。

          • 內聯處理器DjangoLinkInlineProcessor擴展了內置的LinkInlineProcessor,并在它處理的每個鏈接上調用clean_link函數。

          • clean_link函數接收一個鏈接和一個域名,并返回一個轉換后的鏈接。這就是我們要插入我們的實現的地方。

          如何獲得網站域名


          要識別到你自己網站的鏈接,你必須知道你的網站的域名。如果你正在使用Django的sites框架,那么你可以使用它來獲取當前域名。


          我沒有把它包含在我的實現中,因為我們沒有使用sites框架。相反,我們在Django設置中設置了一個變量。


          獲取當前域名的另一種方法是使用HttpRequest對象。如果內容只在你自己的站點中被編輯,你可以嘗試從請求對象中插入站點域名。這可能需要對你的實現進行一些更改。

          要使用該擴展,請在初始化一個新的Markdown實例時添加它:

          太好了,這個擴展已經被使用了,我們準備進入有趣的部分了!

          驗證和轉換Django鏈接

          既然我們得到了在所有鏈接上調用clean_link的擴展,那我們可以來實現我們的驗證和轉換邏輯。

          驗證mailto鏈接

          要開始工作,我們將從一個簡單的驗證開始。mailto鏈接對于使用預定義的收件人地址、主題甚至消息正文打開用戶的電子郵件客戶端非常有用。

          一個常見的mailto鏈接是這樣的:

          這個鏈接將打開你的電子郵件客戶端,并設置成撰寫一封主題行為“我需要幫助!”的新電子郵件給“support@service.com”。

          mailto鏈接不一定非要包含電子郵件地址。如果你看一看這篇文章底部的“分享”按鈕,你會發現像這樣的一個mailto鏈接:

          這個mailto鏈接沒有包含收件人,僅包含了主題行和消息正文。

          既然我們已經很好地理解了mailto鏈接是什么樣子的,我們就可以向clean_link函數添加第一個驗證:

          為了驗證mailto鏈接,我們向clean_link中添加了以下代碼:

          • 檢查鏈接是否以mailto:開頭,以識別相關鏈接。

          • 使用正則表達式將鏈接分割到它的組件。

          • 從mailto鏈接中刪除實際的電子郵件地址,并使用Django的EmailValidator驗證它。

          注意,我們還添加了一種名為InvalidMarkdown的新異常類型。我們定義了自己的自定義異常類型,以將它與markdown本身所引發的其他錯誤區分開來。

          自定義錯誤類

          我曾經寫過關于自定義錯誤類的文章,為什么它們是有用的,以及你什么時候應該使用它們。

          在我們繼續之前,讓我們添加一些測試,看看它的實際效果:

          太棒了!按預期的運行了。

          處理內部和外部鏈接

          既然我們已經了解了mailto鏈接,我們也可以處理其他類型的鏈接:

          外部鏈接

          • 我們的Django應用程序外部的鏈接。

          • 必須包含一個頁面跳轉協議(scheme):http或https。

          • 理想情況下,我們還希望確保這些鏈接沒有被破壞,但我們現在不會這樣做。

          內部鏈接

          • 到我們的Django應用程序中的頁面的鏈接。

          • 鏈接必須是相對的:這將允許我們在不同環境之間移動內容。

          • 使用Django的URL名稱而不是一個URL路徑:這將允許我們安全地來回移動視圖,而不必擔心markdown內容中的失效鏈接。

          • 鏈接可能包含查詢參數(?)和片段(#)。

          SEO

          從SEO的角度來看,公共URL不應該改變。當他們這樣做的時候,你應該使用重定向正確地處理它,否則你可能會受到搜索引擎的懲罰。

          有了這個需求列表,我們就可以開始工作了。

          解析URL名稱

          要鏈接到內部頁面,我們希望編寫者提供一個URL名稱,而不是URL路徑。例如,假設我們有這個視圖:

          這個頁面的URL路徑是https://example.com/, URL名稱是home。我們想要在我們的markdown鏈接中使用這個URL名稱home,就像這樣:

          這將渲染到:

          我們還想支持查詢參數和散列:

          這將渲染到以下HTML:

          在使用URL名稱時,如果我們更改了URL路徑,內容中的鏈接將不會被破壞。要檢查作者提供的href是否是一個有效的url_name,我們可以嘗試reverse它:

          URL名稱“home”指向URL路徑“/”。當沒有匹配項時,將會引發一個異常:

          在我們繼續之前,當URL名稱包含查詢參數或散列時,會發生什么:

          這是有意義的,因為查詢參數和散列不是URL名稱的一部分。

          要使用reverse并支持查詢參數和散列,我們首先需要清除值。然后,檢查它是一個有效的URL名稱,并返回包含查詢參數和散列的URL路徑,如果提供了的話:

          這個代碼段使用一個正則表達式來以?或#的出現對href進行分割,并返回各部分。

          請確保它可以工作:

          太了不起了!作者們現在可以在Markdown中使用URL名稱了。它們還可以包括要添加到該URL的查詢參數和片段。

          處理外部鏈接

          要正確處理外部鏈接,我們需要檢查兩件事:

          1.外部鏈接總是提供一個跳轉協議,http:或者https:。

          2.阻止到我們自己網站的絕對鏈接。內部鏈接應該使用URL名稱。

          到目前為止,我們已經處理了URL名稱和mailto鏈接。如果我們通過了這兩個檢查,這意味著href是一個URL。讓我們從檢查鏈接是否是鏈接到我們自己的網站開始:

          函數urlparse會返回一個命名元組,該元組包含URL的不同部分。如果netloc屬性等于site_domain,那么該鏈接就確實是一個內部鏈接。

          如果URL實際上是內部的,我們就需要終止。但是,請記住,作者們不一定是技術人員,因此我們希望幫助他們,并提供一個有用的錯誤消息。我們要求該內部鏈接使用URL名稱而不是URL路徑,所以最好讓作者們知道他們提供的路徑的URL名稱。

          要獲得一個URL路徑的URL名稱,Django為我們提供了一個名為resolve的函數:

          當找到匹配項時,resolve會返回一個ResolverMatch對象,其中包含URL名稱和其他信息。當沒有找到匹配項時,它就會引發一個錯誤:

          這實際上就是Django在底層所做的工作,用來確定在一個新請求到來時執行哪個視圖函數。

          為了給作者們提供更好的錯誤信息,我們可以使用來自ResolverMatch對象的URL名稱:

          當我們識別出內部鏈接時,我們要處理兩種情況:

          • 我們沒有識別出這個URL:這個URL很可能是不正確的。請作者檢查該URL是否有錯誤。

          • 我們識別出了這個URL: 這個URL是正確的,所以就告訴作者應該使用什么URL名稱。

          我們來實際地看一下它:

          漂亮!外部鏈接被接受,內部鏈接被拒絕,并帶有一個有用的消息。

          要求跳轉協議

          我們要做的最后一件事是確保外部鏈接包含一個跳轉協議,要么是http:,要么是https:。讓我們將這最后一部分添加到函數clean_link:

          使用解析后的URL,我們可以很容易地檢查跳轉協議。讓我們確保它正在工作:

          我們向這個函數提供了一個沒有跳轉協議的鏈接,但是它運行失敗了,并顯示了一條有用的消息。太酷了!

          整合代碼

          這是clean_link函數的全部代碼:

          要了解所有這些特性的一個實際用例是什么樣子的,請看下面的內容:

          這將產生以下HTML:

          不錯!

          結論

          我們現在有一個很不錯的擴展,它可以驗證和轉換Markdown文檔中的鏈接!現在,在不同環境之間移動文檔和保持內容整潔要容易多了,最重要的是,可以保持正確和最新!

          源碼

          你可以在這個gist中找到全部源代碼。(地址:https://gist.github.com/hakib/73fccc340e855bb65f42197e298c0c7d )

          題外話

          本文中所描述的功能對我們很有用,但是你可能需要根據自己的需求對它進行調整。

          如果你需要一些想法,那么除了這個擴展之外,我們還創建了一個markdown Preprocessor,它允許作者們在markdown中使用常量。例如,我們定義了一個名為SUPPORT_EMAIL的常量,我們像這樣使用它:

          該預處理程序將用我們定義的文本替換字符串$SUPPORT_EMAIL,然后才渲染Markdown。

          英文原文:https://hakibenita.com/django-markdown
          譯者:Nothing

          之前的一篇文章已經給大家提供了免費SSL證書的申請方法,這一篇文章是告訴大家在使用免費的SSL證書時可能會遇到的問題【怎么讓http自動跳轉到https以及http與https同時使用】的解決方法。

          問題描述:當https可以免費申請后,越來越多的朋友都為自己的網站去申請了ssl證書,不僅能夠在搜索引擎的排名上獲得一定優勢,而且在網站的信譽上也能獲得很大的提升,但是很多草根站長、個人站長、網站愛好者等不一定懂怎么去綁定ssl證書到網站上,也不懂怎么讓網站開啟https加密模式瀏覽,更不懂http怎么才能跳轉到https,看到大家的問題后,不二版本就在這里為大家詳細的介紹一下http通過iis rewrite url 301重定向的方式自動跳轉到https。(此篇文章同時適用于:阿里云、騰訊云、百度云、美橙云、360云主機、西部數碼等主機商的云主機,不適用與使用虛擬主機的朋友)

          網站啟用HTTPS訪問后,http怎么自動跳轉到https?

          首先我們要確保IIS管理器上面有URL重寫模塊,如果沒有的童鞋可以到微軟官網下載,下面提供下載方式:

          IIS7(其它版本可在官網查找)下載地址:

          URL Rewrite簡體中文32位

          URL Rewrite簡體中文64位

          URL Rewrite英文版

          注意:如果之前安裝過英文版url rewrite的同學想要將英文版的重寫模塊更換成為簡體中文版,需要先在控制面板-添加/刪除程序中將以前安裝的英文模塊刪除掉,然后再進行簡體中文版的安裝。

          接下來我們開始添加重寫規則:

          1. 在服務器IIS控制臺中找到URL重寫模塊(英文版:URL Rewrite)確認以后進入下個步驟;

          2. 選中需要實現http跳轉https功能的網站,雙擊“URL重寫”,選擇如下圖“添加規則”;

          3. 在彈出的引導框中選擇空白規則(默認選項即可),點擊確定進入入站規則編輯界面;

          1. 根據下圖示意進行規則編輯(按圖所示進行操作);

            注※:名稱可以隨意編輯,模式需要自行輸入:(.*)

          2. 展開條件選項菜單,點擊添加按鈕,照著下圖進行編輯輸入,點擊確定完成條件添加;

            注※:條件輸入:{HTTPS},默認選擇與模式匹配,模式輸入:^OFF$

          1. 在走一波剛才的操作,如圖所示,添加條件,點擊確定;

            注※:條件輸入:{HTTPS_HOST},默認選擇與模式不匹配,模式輸入:^(localhost)

          2. 選擇執行操作類型,如下圖;

            注※:操作類型選擇重定向,重定向URL輸入:https://{HTTP_HOST}/{R:1},重定向類型選擇301永久性

          1. 填寫完畢,點擊右上角應用,應用此規則;

          按照以上操作下來就大功告成了,此時可以用瀏覽器訪問你http的網站檢查是否能夠正常跳轉到https地址,完美的解決http不能跳轉到https。(雖然還有很多方法可以實現,但是PanoEade不建議大家使用403、404、頁面跳轉的模式,那樣會對seo有很大影響,所以慎用!)

          歡迎分享,轉載請注明原文地址:https://www.panoeade.com/post/184.html


          主站蜘蛛池模板: 无码人妻精品一区二区在线视频 | 一区二区三区四区国产| 日韩精品人妻av一区二区三区| 久久国产精品免费一区| 亚洲AV无码一区二区乱孑伦AS| 精品福利一区二区三| 一区二区三区四区无限乱码| 国产麻豆剧果冻传媒一区| 99久久综合狠狠综合久久一区| 国产免费播放一区二区| 亚洲综合一区国产精品| 久久久久人妻精品一区二区三区| 狠狠色婷婷久久一区二区三区| 国产精品久久久久一区二区三区| 精品一区中文字幕| 成人精品一区二区三区校园激情 | 日本精品一区二区三本中文| 波多野结衣中文字幕一区| 精品深夜AV无码一区二区老年| 免费av一区二区三区| 成人无码一区二区三区| 麻豆精品一区二区综合av| 国产一区二区在线视频播放| 极品少妇伦理一区二区| 亚洲综合无码一区二区痴汉| 日韩在线一区二区| 亚洲精品伦理熟女国产一区二区| 日韩高清国产一区在线 | 免费人人潮人人爽一区二区| 日产精品久久久一区二区| 91一区二区三区四区五区| 少妇激情一区二区三区视频| 久久精品一区二区免费看| 蜜桃臀无码内射一区二区三区| 无码人妻久久一区二区三区| 久久er99热精品一区二区| 中文字幕精品一区二区| 免费看AV毛片一区二区三区| 精品一区二区三区四区电影| 小泽玛丽无码视频一区| 美日韩一区二区三区|