<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Htaccess on ララジャパン</title>
        <link>https://www.larajapan.com/tags/htaccess/</link>
        <description>Recent content in Htaccess on ララジャパン</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Sun, 14 Mar 2021 02:46:25 +0900</lastBuildDate><atom:link href="https://www.larajapan.com/tags/htaccess/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Laravel 7.x更新で発見したこと（２）URLの余分なスラッシュ</title>
        <link>https://www.larajapan.com/2021/03/14/laravel-7-x%E6%9B%B4%E6%96%B0%E3%81%A7%E7%99%BA%E8%A6%8B%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%EF%BC%88%EF%BC%92%EF%BC%89url%E3%81%AE%E4%BD%99%E5%88%86%E3%81%AA%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7/</link>
        <pubDate>Sun, 14 Mar 2021 02:46:25 +0900</pubDate>
        
        <guid>https://www.larajapan.com/2021/03/14/laravel-7-x%E6%9B%B4%E6%96%B0%E3%81%A7%E7%99%BA%E8%A6%8B%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%EF%BC%88%EF%BC%92%EF%BC%89url%E3%81%AE%E4%BD%99%E5%88%86%E3%81%AA%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7/</guid>
        <description>&lt;p&gt;これも前回と同様に、開発したプログラムに今まであったバグがLaravelの更新により表面化したという話です。&lt;/p&gt;
&lt;h2&gt;余分なスラッシュ&lt;/h2&gt;
&lt;p&gt;例えば、このブログで以下のようなURLあります。&lt;/p&gt;
&lt;p&gt;/2021/02/16/laravel-7-xのインストール&lt;/p&gt;
&lt;p&gt;このURLに含まれるスラッシュに余分にスラッシュをつけます。以下では.comの直後にです。&lt;/p&gt;
&lt;p&gt;//2021/02/16/laravel-7-xのインストール&lt;/p&gt;
&lt;p&gt;上のリンクをクリックしたらわかりますが、余分なスラッシュを削除して最初のようなURLにして希望したページを表示してくれます。これは、ブラウザが修正してくれるのではなくサーバーで使用しているワードプレスのプログラムが修正してくれます。&lt;/p&gt;
&lt;h2&gt;Laravel 7.x更新で余分なスラッシュが禁止となる&lt;/h2&gt;
&lt;p&gt;これに気づいたのは、お客さんのサイトでLaravelを&lt;strong&gt;6&lt;/strong&gt;から&lt;strong&gt;7&lt;/strong&gt;に更新した後です。お客さんが発行したメルマガに入っていた販売商品のページのリンクに余分なスラッシュが含まれていたのです。そのためにリンク先のページにアクセスしても、404の「ページが見つかりません」のエラーページです。さあ大変ということで原因わからずに、即座にLaravel6にダウングレードと、冷や汗ものでした。&lt;/p&gt;
&lt;p&gt;お客さんの話では以前は余計なスラッシュが入っていてもアクセスできたということです。さて、いったいどういことでしょう、ということで調査すると、ありました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/laravel/framework/pull/32260&#34; rel=&#34;noopener&#34; target=&#34;_blank&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/laravel/framework/pull/32260&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/laravel/framework/pull/32260&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これによると、今までURLにおける余分なスラッシュの扱いにおいて問題がありました。routeをキャッシュしたときとしないときでの統一性にも問題があったそうです。しかしこの&lt;strong&gt;PR&lt;/strong&gt;は、&lt;strong&gt;Laravel 7.x&lt;/strong&gt;のバージョンにマージされています。&lt;/p&gt;
&lt;p&gt;ということで、今後は余分なスラッシュがURLに入らないように注意する必要あります。&lt;/p&gt;
&lt;p&gt;これからその点をしっかり注意するとして、問題は過去のメルマガに含まれるリンクです。過去だからアクセスをする人は少ないと思いますが昨日のメルマガとかからはアクセスしますよね。ということで、&lt;strong&gt;Laravel 7.x&lt;/strong&gt;が対応しないURLを対応しなければなりません。そうでなければいつまでもLaravelの更新ができないです。&lt;/p&gt;
&lt;p&gt;ということで、急いで解決方法を見つけました。&lt;/p&gt;
&lt;h2&gt;解決方法&lt;/h2&gt;
&lt;p&gt;解決方法は意外にも、phpのプログラムの変更ではなく、&lt;strong&gt;public/.htaccess&lt;/strong&gt;の&lt;strong&gt;apache&lt;/strong&gt;のウェブサーバーの設定ファイルの修正でした。&lt;/p&gt;
&lt;p&gt;以下は、URLのドメイン名の直後の余分なスラッシュを削除してくれます。&lt;/p&gt;
&lt;div class=&#34;code-filename&#34;&gt;public/.htaccess&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;IfModule mod_negotiation.c&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Options -MultiViews -Indexes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/IfModule&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteEngine On
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # Handle Authorization Header
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{HTTP:Authorization} .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # Redirect Trailing Slashes If Not A Folder...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_FILENAME} !-d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_URI} (.+)/$
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteRule ^ %1 [L,R=301]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # 余分なスラッシュを削除
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{THE_REQUEST} \s//+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteRule (.*) /$1 [R=301,L]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    # Handle Front Controller...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_FILENAME} !/assets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_FILENAME} !/server-status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_FILENAME} !-d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteCond %{REQUEST_FILENAME} !-f
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    RewriteRule ^ index.php [L]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/IfModule&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;{THE_REQUEST}&lt;/code&gt;は、例えば &lt;code&gt;GET /////2021/02/16/laravel-7-xのインストール HTTP/1.1&lt;/code&gt;のような値が含まれます。GETの後の空白文字が&lt;code&gt;\s&lt;/code&gt;で&lt;code&gt;//+&lt;/code&gt;が複数のスラッシュをマッチの条件とします。&lt;code&gt;$1&lt;/code&gt;の変数には、余計なスラッシュを含まない&lt;code&gt;2021/02/16/laravel-7-xのインストール&lt;/code&gt;の値となるので、&lt;code&gt;/$1&lt;/code&gt;で１つのスラッシュに置き換えてリダイレクトします。&lt;/p&gt;
&lt;p&gt;これで晴れて&lt;strong&gt;Laravel 7.x&lt;/strong&gt;への更新ができます！&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
