Webアプリでnodejs
と書かれたサーバーサイドでAzureクラウドを使用しています。 Webアプリがhttpリクエストを受信したときに、リクエストをhttpsにリダイレクトしたいので、解決策を見つけました。それをrules
タグ内のweb.configファイルに入れます
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}/{R:1}" appendQueryString="false" redirectType="Permanent" />
</rule>
問題は、ブラウザに「 https://myURL.com 」と入力すると、すべてが正常にメイン画面にリダイレクトされますが、httpsをhttpに変更すると「 http:// myURL.com " https://myURL.com/ "にリダイレクトされ、URLが " http: //myURL.com/bin/www "、応答は:ページが見つかりません。
問題は、URLにデータを追加せずにクリアURLをリダイレクトする方法です。
私のweb.configファイルの一部:
<rewrite>
<rules>
<!-- Do not interfere with requests for node-inspector debugging -->
<rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^bin/www\/debug[\/]?" />
</rule>
<!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
<rule name="StaticContent">
<action type="Rewrite" url="public{REQUEST_URI}" />
</rule>
<!-- All other URLs are mapped to the node.js site entry point -->
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True" />
</conditions>
<action type="Rewrite" url="bin/www" />
</rule>
<!-- Redirect all traffic to SSL -->
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}/{R:1}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
<!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->
<security>
<requestFiltering>
<hiddenSegments>
<remove segment="bin" />
</hiddenSegments>
</requestFiltering>
</security>
答えてくれてありがとう、マイケル。
このための無料でオープンソースの拡張機能もあります。
アクションをすぐに有効にするには、Webアプリを再起動します。
できました!
この拡張機能の実装の詳細については、 GitHubのソースコードを確認してください 。最も重要なソースファイルはapplicationhost.xdt
。
引用 GitHubから (02-08-2017)(クレジットはgregjhogan):
applicationhost.xdt
<?xml version="1.0"?> <configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform"> <location path="%XDT_SITENAME%" xdt:Transform="InsertIfMissing" xdt:Locator="Match(path)"> <system.webServer xdt:Transform="InsertIfMissing"> <rewrite xdt:Transform="InsertIfMissing"> <rules xdt:Transform="InsertIfMissing" lockElements="clear"> <rule name="redirect HTTP to HTTPS" enabled="true" stopProcessing="true" lockItem="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> <add input="{WARMUP_REQUEST}" pattern="1" negate="true" /> </conditions> <action type="Redirect" url="https://{HTTP_Host}/{R:1}" appendQueryString="true" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer> </location> </configuration>
2017年11月の時点で、これはAzure Portalの単純なスイッチになりました:カスタムドメインの下の「HTTPSのみ」。
ARMでも非常に簡単です:“httpsOnly”: true
R:1は、ルールパターンへの 後方参照 です。これをここのURLに追加します。
url="https://{HTTP_Host}/{R:1}"
それをに変える
url="https://{HTTP_Host}"
その結果、httpsルートにリダイレクトされます。
Azureポータルに移動し、HTTPSのみに設定する(Web)App Serviceの概要ページを開きます。サイドバーのスタイルセクションの下に、TLS/SSL設定のオプションがあります。クリックすると、画面にHTTPSのみに設定するオプションが表示されます。このために個別のルールセットを手動で追加する必要はありません。これは、「F」シリーズ(無料サブスクリプション)を含むApp Serviceプランのすべての層で機能します。
PS:私はこの質問が約3年前に尋ねられたのを見ました、そしてその時おそらくこれを行う直接的な選択肢はなかったでしょう。しかし、2020年2月にGoogleでこの質問が自動HTTPSリダイレクションに関するさまざまな質問で1位になり、新しい視聴者に役立つと考えているため、私はまだ回答を投稿しています。