1

Ok。だから、私はこれとこれのような不気味に似た質問を見てましが、それらは間違いなく役に立ちましたが、まだ最後の問題に直面しています.

次の URL があるとします。
http://playground.dev/projects/project1 http://playground.dev/projects/project1/work http://playground.dev/projects/project1/work/1.txt

そして、次のディレクトリ構造があるとします。

/var/www
- プロジェクト/
-- project1/
--- public_html/
---- index.html
---- work/
----- 1.txt

私の目標は、各プロジェクト (project1、project2 など) の "ルート" 内にある汎用の .htaccess ファイルを作成し、上記の URL を適切なファイルとディレクトリにマップすることです。

今、私はそれをかなり理解しました:

RewriteEngine On

RewriteRule ^public_html - [L]
RewriteRule ^(.*)$ public_html/$1

これは私が欲しいものを手に入れます。上記の URL はすべて想定どおりにマップされ、ほとんどの外れ値/誤った入力には適切に 4xx が割り当てられます。ただし、問題が 1 つあります。Apache は次のような URL を受け入れます。

http://playground.dev/projects/project1/work/1.txt/fgdgfgfdgfdgd

いいえ、fgdgfgfdgfdgd存在しませんし、「1.txt」もディレクトリではありませんが、Apache は 404 なしでこの忌まわしき行為を続けることを許可するだけでなく、どうにかして「1.txt」ファイルへのパススルーをあたかもかのように管理します。入力した URL は でしたhttp://playground.dev/projects/project1/work/1.txt

.htaccess ファイルを削除してフル パスで同じことを試しても、これは発生しません。apache のドキュメントはほとんど光を当てておらず、Google は飛び散っています。たぶん私は疲れていて、何かが欠けているのでしょう...しかし、ここで何が起こっているのでしょうか?

もう少し具体的に言ってみましょう:

URL は次のように構成されます。http://playground.dev/projects/{projectname}{path}ここで、{projectname} と {path} は両方とも変数であるだけでなく (projectname は単一のディレクトリにすぎません)、{path} が存在する場合と存在しない場合、3 つのディレクトリの深さがある場合とない場合があります。または 300 ディレクトリの深さになることさえあります。

4

1 に答える 1

2

変更:

ファイルまたはディレクトリが存在する限りグローバル リダイレクトを行うには、次のようにします。

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !public_html  [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /public_html/$1  [L,NC]

永続的で目に見えるリダイレクトの場合は、[L,NC] を [R=301,L,NC] に置き換えます。

于 2013-03-16T08:07:06.093 に答える