web-dev-qa-db-ja.com

htaccessを使用してURLからサブディレクトリフォルダーを削除する方法

サイトのURLからサブフォルダーを削除しようとしています。

以下は私のフォルダの構造です。 .htaccessファイルをどこに配置し、何を書き込むべきかわかりません。

  • mysiteroot
    • subdir1
    • subdir2
      • index.php
      • page1.php
      • page2.php
      • page3.php

私は次のことを書きました:

RewriteEngine On
RewriteRule ^$ subdir1/subdir2/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ subdir1/$1

.htaccessファイルがmysiterootフォルダに配置されているインデックスでのみ機能するようです。

page1.phpの代わりにwww.mysiteroot.com/page1を表示するようにwww.mysiteroot.com/subdir1/subdir2/page1.phpをリクエストするにはどうすればよいですか?

2
A-ndy

ソリューションを投稿する前に、このほとんどをすでに書いていました。とにかく、読者が役立つと思うより一般的なソリューションとして投稿します。


page1.phpの代わりにwww.example.com/page1を表示するようにwww.example.com/subdir1/subdir2/page1.phpをリクエストするにはどうすればよいですか?

これを行うには、.htaccessではなく、アプリケーションのURLを物理的に変更します。アプリケーションでURLが変更されると、要求はwww.example.com/page1、つまりユーザーに表示される可視のURL(page.phpではなく)になります。次に、.htaccessでmod_rewriteを使用して、内部的に書き換え表示されるURLを実際の/隠しファイルシステムパス/subdir1/subdir2/page1.phpに戻します。 (しかし、あなたのコードは正しいことをしているので、あなたはすでにこれを知っていると思います。)

ファイル階層図では、subdir2と同じレベルでsubdir1を表示しているように見えますか?ただし、コードとURL構造は、subdir2subdir1のサブディレクトリであることを示唆しています。後で仮定します。

基本的に、次の2つのことを行う必要があります。

  1. すべての要求を/subdir1/subdir2/に書き換えます(ファイルまたはディレクトリに直接マップする要求を除く)。

  2. .phpファイル拡張子を、まだファイル拡張子がないリクエストに追加します。

ドキュメントルートの.htaccessファイルで次のようなものを試してください。 mysiteroot/.htaccess

RewriteEngine On

# If the request has already been rewritten
# Or maps to an existing file then stop here.
# (Can't test for dir here since would not rewrite the doc root)
RewriteCond %{ENV:REDIRECT_STATUS} . [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# No file extension on request then append .php and rewrite to subdir
RewriteCond %{REQUEST_URI} /(.+)
RewriteRule !\.[a-z0-4]{2,4}$ /subdir1/subdir2/%1.php [NC,L]

# All remaining requests simply get rewritten to the subdir
RewriteRule (.*) /subdir1/subdir2/$1 [L]

/path/to/file(ファイルに直接マッピングされない)に対する要求は、内部的に書き換えられます to /subdir1/subdir2/path/to/file.phpになります。

最初のRewriteCondディレクティブは、サブディレクトリにすでに書き換えられたリクエストを書き換えないことを保証し、書き換えループを防ぎます。

1
MrWhite

やりたいことに合ったソリューションを見つけました。オンラインの人々は回答を生成しますが、問題は、ページを参照するために拡張子のない同じページ名を使用するつもりがないことです。これは、メインページのリストを含むファイルを保持することを意味します。

ソリューションの詳細は次のとおりです。-ルートフォルダにhtaccessファイルを配置します-絶対参照を使用してサブディレクトリのページを参照します

htaccessファイルの内容:

RewriteEngine On
Options -Indexes #prevents access to folders
RewriteRule ^page1?$ ./subdir2/page1.php
RewriteRule ^page2?$ ./subdir2/page2.php

これにより、htaccess内のすべてのページは、ルートディレクトリにあるかのように機能します。したがって、メインページではなく、サブフォルダーにあるページを呼び出す場合は、その時点でルートフォルダーから参照してください。

シンプルなソリューションが最適なタイミングで機能する

1
A-ndy