web-dev-qa-db-ja.com

.htaccessを使用してURLから末尾のスラッシュを削除するにはどうすればよいですか?

状況

ドメイン全体で、URLにファイル拡張子を非表示にするおよび末尾のスラッシュを削除する、ドメイン名自体とは無関係です(たとえば、どのドメインでも動作します)。

ディレクトリ構造のサンプル

ホームページ以外のindex。*ファイルは使用していません。

  • /
    • /index.php
    • /account.php
    • /アカウント
      • /subscriptions.php
    • /login.php
    • /ログインする
      • /reset-password.php

目標

これらのファイルがどのように要求され、ブラウザでどのように表示されるかについてのいくつかの例:

  • /およびindex.php-> mydomain.com(文字通り、単なるドメイン名)。

  • /account.phpまたは/account/または/account-> mydomain.com/account

  • /account/subscriptions.phpまたは/account/subscriptions/または/account/subscriptions-> mydomain.com/account/subscriptions

ご覧のとおり、各Webページにアクセスするにはいくつかの方法がありますが、2つまたは3つの方法のいずれを使用しても、ブラウザに優先URLが1つだけ表示されます。

質問

mod_rewriteを使用して.htaccessでこれを行う方法

私はこれを理解しようとして壁に頭を打ちましたが、一般的に、書き換えフローは次のように思われます:

  1. 外部301リダイレクト(mydomain.com/account/-> mydomain.com/account
  2. 内部で.phpを追加します(mydomain.com/account-> mydomain.com/account.php

私は一日中グーグルで調べ、数千行のドキュメントと設定テキストを読んで、数十回試してみました...これに関するより多くの頭脳が大いに役立つと思います。

更新

質問に対する回答が見つかりました(下記を参照)。

7
Matt

質問をご覧いただきありがとうございますが、私たちはそれを理解したようです。

Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /
DirectorySlash Off

# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]

エンジンが混乱しないようにマルチビューとインデックスをオフにする必要があります。代わりに、index.*ファイルを参照するか、ディレクトリリストが表示されるようにします。 。

最初のリダイレクト(R=301)は末尾のスラッシュを削除し、2番目のリダイレクトはそれを手元のPHP(またはHTMLなど)ファイルに内部的に書き換えます。

この.htaccessファイルはクエリ文字列もサポートしています。

更新以前のコメントで述べたように、nginxに切り替えました。これは、(devボックスからの)URL書き換えに関連するすべてのconfファイルに含まれています。

location = / {
    index index.html;
}

try_files $uri $uri.html =404;

また、PHPから単なるHTMLに切り替えましたが、上記の拡張機能を変更してもほとんど違いはありません。

7
Matt

なぜ/ accountを/account.phpにリダイレクトするのですか?実際、ページ/ accountは コンテンツネゴシエーション でのみ存在します。必要ない場合は、ディレクティブを無効にしてください。

あなたの2つのルールについて、私はそれが簡単だと思います:

RewriteRule ^/account/$ /account
RewriteRule ^/account$ /account.php [R,L]

ただし、テストされていません。 [R,L]を最初の行に追加することもできます。この場合、ブラウザーはもう1つリダイレクトを行います。

0
jcisio

ウェブサイトやアプリのURLリクエストをルーティングするための柔軟でシンプルな方法が必要な場合は、PHPマイクロフレームワークをお勧めします。 URLルーティングを完全に制御できるだけでなく、他の利点も提供します。

Symfony Templating Component と組み合わせた Slim Framework を以前に使用したことがあります。もう一度やるなら、おそらく Silex Micro-framework を使用するでしょう。これはSymfonyコンポーネントの一部でもあるからです。

0
Kevin C.