Lumenでurlパラメータが通らなかったけど解決した件

ConoHaのVPSを使ってLumenでAPIを作っているのですが、routes.phpで設定したとおりにURLパラメータがとおらないという事体が発生しました。

結論は、サーバーのhttpd.confに下記の用に記載することで解決しました。

DocumentRoot "/var/www/LumenAPI/public"
ServerName localhost

# from Here
<Directory "var/www/LumenAPI/public">
 AllowOverride None

<IfModule mod_rewrite.c>
 <IfModule mod_negotiation.c>
  Options -MultiViews
 </IfModule>
 RewriteEngine On

 RewriteRule ^(.*)/$ /$1 [L,R=301]

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^ index.php [L]
</IfModule>
</Directory>

Linuxサーバーの知識が乏しいのでトラブルにハマりまくりですが、今回は下北沢OSScafeの河村さんのアドバイスもあり、なんとか解決できましたので、トラブった内容と解決方法をブログに書いておこうと思います。

目次

LumenでURLパラメータが通らない?

/app/Httpd/routes.php に、$app->getでURLパラメータを記載しました。

$app->get('/', function(){
    echo "TEST";
});

とかいて、ブラウザからURLを入力すると、これは普通に表示されました。

でも、

$app->get('/test', function(){
    echo "TESTTEST";
});

とかいて、ブラウザから ” hoge.com/test ” とやっても、Not Foundで404が返ってきます。

lumen url parameter

hoge.com/index.php/testだと通る?

StackOverFlowにて、下記の記事を見付けました。まさに、Lumenでroute requestが動かない件です。

laravel – Lumen simple route request doesn’t work – Stack Overflow

これをみたところ、パラメータの前にindex.phpを入れて動くか?みたいなことがいわれていました。

For example, yourdomain.com/api would become yourdomain.com/index.php/api

なので、routes.phpに次のように記載

$app->get('index.php/test', function(){
    echo "TEST_index";
});

これで、ブラウザから” hoge.com/index.php/test “とためしたところ無事に表示されました。

lumen url parameter

で、解決方法ですが、ここでは、.htaccessを使うとサイトのスピードが遅くなるから、バーチャルホストに.htaccessの内容を書くほうがいいよと回答されていました。

<VirtualHost *:80>
    DocumentRoot "/var/www/lumen/public"  # Change this line
    ServerName yourdomain.com             # Change this line

    <Directory "/var/www/lumen/public">   # Change this line
        # Ignore the .htaccess file in this directory
        AllowOverride None

        # Make pretty URLs
        <IfModule mod_rewrite.c>
            <IfModule mod_negotiation.c>
                Options -MultiViews
            </IfModule>

            RewriteEngine On

            # Redirect Trailing Slashes...
            RewriteRule ^(.*)/$ /$1 [L,R=301]

            # Handle Front Controller...
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^ index.php [L]
        </IfModule>
    </Directory>
</VirtualHost>

ConoHaでhttpd.confに下記の用に記載

上記からここに至るまですんなりはいかなかったのですが、結果的にサーバー側のhttpd.confに下記の用に記載することによって、index.php/test みたいにしなくても無事に表示されるようになりました。


DocumentRoot "/var/www/LumenAPI/public"
ServerName localhost

<Directory "var/www/LumenAPI/public">
 AllowOverride None

<IfModule mod_rewrite.c>
 <IfModule mod_negotiation.c>
  Options -MultiViews
 </IfModule>
 RewriteEngine On

 RewriteRule ^(.*)/$ /$1 [L,R=301]

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^ index.php [L]
</IfModule>
</Directory>

httpd.confを更新したら、service httpd restartするのを忘れずに。

まとめ

今までレンタルサーバーしか使ってませんでしたがLumenでAPIを作ろうと思ったのがきっかけで、最近ではLinuxサーバーの勉強をしています。

ここらへんは慣れないことばかりで、昨日もAtomにremote-ftpを入れてSSH接続でサーバーのファイルを更新できるよう取り組んでいたのですが、SSH接続はできるもののファイルの書き込みがPermission Deniedでできないことに数時間悩みました。

結局、/var/wwwフォルダの所有者がrootだった為だということがわかり、フォルダの所有者を変更することで解決したのですが、今回のhttpd.confの件もそうですが、ひとつひとつを前にすすめるためにすごく時間がかかっています。

まぁ、ちょっとづつでも成長はしているようなので、引き続き頑張っていきたいとおもいます!

あと、ConoHaを使おうと思ってたら、私の友達紹介で1000円のクーポンが入ると同時に私にもクーポンが貰えるので、よかったら下記リンクをチェックしてみてください。

ConoHaをお友達紹介制度で使う