.htaccessファイルにURL書き換えを実装するにはどうすればよいですか?


17

ユーザーに次のようなアドレスが表示されるのではなく、URLを書き換えたいのですが(なぜ?この質問を参照してください)。

labouseur.com/course-compilers.html 

代わりに、単純に表示して使用することができます

labouseur.com/course-compilers

(さらに良いことに、コース/コンパイラーになるように再構築する必要があります。)

私は自分のウェブサイトにLinuxベースの共有ホスティングサービスを使用しているので、サーバーの管理制御はできませんが、.htaccessを制御できます。私がオンラインで読んだ参考文献は私にはあまりはっきりしていないように思えたので、ここで少し明快さとアドバイスを探しています。


これはサーバー設定(.htaccess)でのみ行うことではないことに注意してください。重要な最初のステップは、アプリケーション内のURLを実際に変更することです。そうしないと、多くの不要なリダイレクト(またはコンテンツの複製)が発生します。
MrWhite

回答:


13

実際にサーバー上のファイルから.htmlを削除し、htaccessで設定して、htmlファイルとして提供されるようにすることもできますが、おそらくそれはあなたが探しているものではありません。

これを行う :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html

特に、コンテンツの重複の問題を心配している場合は、より複雑になります。上記のルールを使用すると、古いURLからページにアクセスできます。
ジェイソンバーチ

3

まず、apacheにモジュールがあり、.htaccesファイルで許可されていることを確認してから、次を追加します。

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

あなたの例では

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

単一レベルのディレクトリ構造と

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

マルチレベル構造の場合。

しかし、注意してください

構造がある場合

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

.htaccessファイル内の書き換えルールは、その親フォルダーに対して相対的であり、面倒な書き換えループの状況に陥ることがあります。RewriteCondできれば、それらの発生を止めるために使用してください!


(RewriteCondを使用してループを停止する)その最後のポイントをさらに詳しく説明してもいいですか?
トラビスノースカット

2

上記の回答に加えて、使用することができます

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) ハイフン(-)付きの文字、数字を使用できます。

(.*) 関係なくすべてのリクエストを書き換えます。これにより、アクセス時に内部サーバーエラーを引き起こす他の以下のルールが無効になる場合があります。


あなたのRewriteRule パターンは、質問で与えられた特定の例に対して受け入れられた答えよりも改善されていますが、複数のパスセグメントがある場合、より一般的なケースとは一致しません。/path/to/course-compilersLフラグを含めて、次のルールへの影響を減らします。この(.*)パターンは不必要に一般的ですが、ファイルをチェックする条件が存在するため、深刻な問題を引き起こすことはほとんどありません。
MrWhite

1

これを実現するために.htaccessファイルを使用する必要はありません。ファイルをディレクトリに単純に構造化し、「labouseur.com/course-compilers.html」を使用する代わりに、ファイルにindex.htmlという名前を付けて、「course-compilers」というディレクトリに配置します。その後、そのディレクトリをポイントすると、インデックスはデフォルトで提供されますが、URLには表示されません。したがって、リンクを「labourseur.com/course-compilers」と書くだけで十分です。

.htaccessは不要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.