web-dev-qa-db-ja.com

サブフォルダーをURLに表示しないようにする

www.example.com/_/randomfolderからexample.com/randomfolderに移動します。 /_/randomfolderのコンテンツにアクセスする必要がありますが、example.com/randomfolderを表示する必要があります。

私が試したこと:

試験1

RewriteEngine On
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_Host}/$1 [R=301,L,QSA]
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

問題:/_/randomfolderの要件を完全に満たしますが、example.com/randomfolderを表示する必要がありますが、メインドメインexample.comに影響します。何も表示されず、404ページのみが表示されます。 public_html/index.phpのみを表示します。

試験2:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#To load site from  /_/xyz to /xyz  without hcanigng url
RewriteRule ^[A-Za-z0-9._]+  /_/%{REQUEST_URI} [L]

問題:アドレスバーを手動でwww.example.com/_/randomfolderからexample.com/randomfolderに変更する必要があります。コンテンツは_ありまたはなしで読み込まれますが、最初に/_/random folderへのリダイレクトを読み込みます。

3
mrniamster

あなたはまだ/_を含むURLにリンクしていますか?
...はい、ただしユーザーがonclickイベントにリンクしようとするたびに、新しいタブに_/が表示されます

これを「修正」するために.htaccessにリダイレクトを実装するかどうかに関係なく、あなたはまだHTMLソースのURLから/_の部分を物理的に削除する必要がありますユーザーがクリック。それ以外の場合、ユーザーからは「非表示」になりません(ページ上とブラウザーのステータスバーに表示されます)。 リダイレクトこれらのURLは、サーバーに到達するリクエストの数を2倍にし、ユーザーエクスペリエンスを遅くする可能性があります。

...私はメインのpublic_htmlをスパムしたくない

「スパム」の意味が正確にはわかりませんが、ユーザーと検索エンジンに関する限り、URLを(実質的に)メインディレクトリにあるように見せることは、実際にメインディレクトリにあることと同じです。ローカルファイルシステムに関する限り、同じ方法で競合を回避する必要があります。

index.phpが入っているランダムなフォルダは、このようなwe.xyz.com/_/randomfolder/index.phpです。

その場合、ディレクトリではなくindex.phpに直接書き換える必要があります。そうしないと、index.phpの内部サブリクエストを発行するためにmod_dirが必要になります。また、末尾のスラッシュを省略すると、mod_dirは外部リダイレクトを発行します-これは望ましくありません。

仮定:

  1. randomfolderは、a-zA-Z0-9_(アンダースコア)、-(ハイフン)および.(ドット)。正規表現に含まれているように見えるので、ドットのみを含めましたが、それ以外の場合は、ドットを含むディレクトリを除外する必要はありません。また、ドットを省略すると条件が簡素化されます(リクエストがファイルと一致しないことを確認する必要がないため)。

  2. /_/<randomfolder/<anything>形式のリクエストは、リクエストから末尾の/<anything>を取り除きます。そして、/<randomfolder>(末尾のスラッシュなし)にリダイレクトします。

  3. /<randomfolder>(末尾のスラッシュの有無にかかわらず)形式のリクエストのみが/_/<randomfolder>/index.phpに書き換えられます。現在、書き換えの前に宛先ファイルが存在することを確認していません(いずれにしても404になります)。

以下を試してください:

# Redirect requests to remove "/_" from the URL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^_/([\w.-]+) /$1 [R=302,L]

# Internally rewrite from "/<folder>" to "/_/<folder>/"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w.-]+)/?$ /_/$1/index.php [L]
1
MrWhite