14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

React.jsのIISデプロイ方法

Last updated at Posted at 2022-05-23

はじめに

reactのIISデプロイ方法に難儀したので備忘録として残します。
投稿久々~~~~((´∀`))ケラケラケラケラケラケラケラケラケラケラケラケラケラケラケラケラ

環境

  • Windows Server 2016
  • IIS: 10.0.14393.0
  • url-rewite: 2.0
  • node: v16.15.0
  • React: v18.1.0
  • react-router-dom: 6.3.0

プロジェクトの作成

create-react-appでreactのプロジェクトを作ります。

npx create-react-app deploy-app

これをbuildして、デプロイモジュールを作ります。

cd deploy-app
npm run build

buildが完了したらbuildフォルダにモジュール一式作成されます。
image.png

IISデプロイ その1

IISを開いてサイトを追加していきます。
まずはアプリケーションプールを追加します。
image.png

名前はreact-deployで行きます。
image.png

詳細設定はこんな感じです。
image.png

次に先ほど作成したbuildフォルダをC:\inetpub\wwwrootにコピーして
名前をreact-deployにしておきます。
image.png

次にWebサイトの追加を行います。
image.png

  • サイト名 react-deploy
  • 物理パス C:\inetpub\wwwroot\react-deploy
  • バインドポート 8080
    ※ポート番号は気分で変えてます
    image.png

デプロイしたマシンのIPアドレス:8080にアクセスします。
image.png
デプロイできました。

他のマシンから覗くと繋がらなかったのでtcpポートを開放しておきます。
素直にポート80にしておけばよかったと思いました。

コントロールパネル > システムとセキュリティ > Windows ファイアウォール > 詳細設定 を開きます。
image.png

受信の規則を開きます。
image.png

新しい規則を作ります。
image.png

image.png

image.png

image.png

image.png

これで外から繋がるようになりました。
さくっと試すだけならファイアウォール全部止めちゃってもいいと思います。
自己責任にはなりますが。。。

react-router-domのインストール

これだけだと物足りないので次にroutingも正常に動くか見ていきます。

まずはreact-router-domをインストールします。

cd ../
npm install react-router-dom@6.3.0

ものすごく簡単なページを作ります。
src直下にpagesフォルダを作成し、Home.jsxPage1.jsxPage2.jsxを作成します。

pages/Home.jsx
import React from "react";
import { Link } from "react-router-dom";

export function Home() {

  return (
    <div className="Home">
      Home画面です。
      <nav>
        <ul>
          <li><Link to="page1">Page1</Link></li>
          <li><Link to="page2">Page2</Link></li>
        </ul>
      </nav>  
    </div>
  );
}
pages/Page1.jsx
import React from "react";
import { Link } from "react-router-dom";

export function Page1() {

  return (
    <div className="Page1">
      Page1
      <nav>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/page2">Page2</Link></li>
        </ul>
      </nav> 
    </div>
  );
}
pages/Page2.jsx
import React from "react";
import { Link } from "react-router-dom";

export function Page2() {

  return (
    <div className="Page2">
      Page2
      <nav>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/page1">Page1</Link></li>
        </ul>
      </nav> 
    </div>
  );
}
App.js
import './App.css';
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { Home } from './pages/Home';
import { Page1 } from './pages/Page1';
import { Page2 } from './pages/Page2';

function App() {
  return (
    <div className="App">
     <BrowserRouter>
      <Routes>
        <Route index element={<Home />} />
        <Route path="page1" element={<Page1 />} />
        <Route path="page2" element={<Page2 />} />
      </Routes>
    </BrowserRouter>
    </div>
  );
}

export default App;

一応、動作確認しておきます。
image.png
image.png
image.png

動いてそうです。
モジュールを作り直してデプロイしなおします。
念のため、アプリケーションプールを停止してからC:\inetpub\wwwroot\react-deployの中身を入れ替え、サイトを開始します。
一応動いていそうです。
image.png

と、思いきやブラウザからデプロイしたマシンのIPアドレス:8080/page1にアクセスすると404エラーが表示されます。
image.png
プログラムからだと正常に動いているような気もします。

ReactはSPAなのでindex.htmlを読む分にはうまくいくらしいですが、直リンクだとリソースがないと怒られるらしいです。
stackoverflowとかを見るとurl-rewriteモジュールを使えと書いてあります。

url-rewriteのインストール

url-rewriteモジュールからインストーラーをダウンロードして、インストールします。
image.png

image.png

image.png

web.configの配置

ビルドモジュール直下の所にweb.configを配置する必要があるみたいです。
image.png

内容はこんな感じです。

web.config
<?xml version="1.0"?>  
<configuration>  
    <system.webServer>  
        <rewrite>  
            <rules>  
                <rule name="React Routes" stopProcessing="true">  
                    <match url=".*" />  
                    <conditions logicalGrouping="MatchAll">  
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />  
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />  
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />  
                    </conditions>  
                    <action type="Rewrite" url="/" />  
                </rule>  
            </rules>  
        </rewrite>  
    </system.webServer>  
</configuration>     

IISデプロイ その2

再度、アプリを再起動し、ブラウザから直リンクでアクセスしてみると見えることができました。
image.png

参考URL

以下のURLを参考にしました。有益なサイト達に感謝します。
react-routerを使ったアプリケーションでURL直叩き(or F5)すると404になる
Reactで直接URLをたたくと404になる時の対応
Deploy React Application on IIS Server
How To Deploy React Application On IIS Server
how to prevent iis default not-found page and show a custom reactjs not-found page

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?