0

専用ボックスに別々のドキュメントルートを指す別々のドメインがあります

このドキュメントルートの下にあるサブフォルダftp-uploadへのFTPアクセスを許可したいと思います。

適切なFTP構成はこの質問の一部ではありません

許可された人がファイルをdocument_root/ftp-uploadにアップロードする場合、このファイルには、domain.com / ftp-upload/fileではなくdomain.com/fileからアクセスできる必要があります。

.htaccessファイルはドキュメントルートにあります

私はいくつかのことを試しましたが、うまくいかないようです。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    ## check if the file exists in subfolder
    ##   ...and if found, stop and display it
    RewriteCond %{DOCUMENT_ROOT}/ftp-upload/$1 -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/ftp-upload/$1 -d
    RewriteCond $1 !^$
    RewriteRule  (.*)  %{DOCUMENT_ROOT}/ftp-upload/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(index\.php|images|robots\.txt|css|assets|ftp-upload)
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

私も試しました

RewriteCond  %{DOCUMENT_ROOT}/ftp-upload/${REQUEST_FILENAME} -f

RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -f

これは進行中の作業であるため、これは最終的な解決策にはなりませんが、この機能は多くの要望があります。そして、可能であれば、ドキュメントルートへのアクセスを許可したくありません。

更新:必要なときに、機能するように見えます...

domain.com/test.txt(ftp-uploadディレクトリにのみ存在します)と入力すると、リクエストはdomain.com/index.php/test.txtに送信され、ホームページが表示されます。

domain.com/ftp-upload/と入力すると、test.txtを含むディレクトリリストが表示されます。

test.txtをクリックすると、ファイルの内容が表示されます(これは「動作します!」)。次にdomain.com/test.txtと入力すると、ファイルの内容が再び表示されます...

私の頭が爆発した...何かアイデアはありますか?

別の方法で解決しましたここでの回答は私のサーバーでは機能しませんでした。

私が構築したCMSには、別のユーザーグループ「SEO最適化」とアップロードセクションがあります。そのセクションで、ユーザーはファイルをアップロードする割り当てられた場所を選択できます。ウェブサイトindex.php(controller / router)は、アップロードフォルダーに存在する場合、要求されたファイルを提供します。サーバーがファンキーに動作していたため、.htaccessの編集はありません。

4

5 に答える 5

7

私が理解している事実(間違っていたら訂正してください)

  • 別々のドキュメントルートを指す別々のドメインがあります
  • ftp-uploadこのドキュメント ルートの下にあるサブフォルダへの FTP アクセスを許可したいと考えています。
  • 適切な FTP 構成は、この質問の一部ではありません
  • 許可された人が にファイルをアップロードする場合document_root/ftp-upload、このファイルdomain.com/filedomain.com/ftp-upload/file
  • .htaccess ファイルはドキュメント ルートにあります

上記の事実については、ここに作業.htaccessファイルがあります。私が使用したフォルダ名はftp-uploadであることに注意してください。質問でいくつかの異なるバージョンを使用しました ( ftp-uploadftp_uploadftpupload) 確認してください。これは構成で一貫しています。

ドメインのドキュメント ルート フォルダの .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/ftp-upload%{REQUEST_URI} -d 
RewriteRule ^(.*)$  ftp-upload/$1       [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt|css|assets)
RewriteRule ^(.*)$  index.php/$1        [L]

私がしていることは、要求されたファイルがサブフォルダーに存在することを確認することです/ftp-upload

注意がRewriteCond file -f必要なのは、フル パスが必要なことです。%{REQUEST_FILENAME}% そのため、通常、この条件が true (ファイルが存在する) の場合は、単に要求を次のように書き換えてテストします。ftp-upload/filename

これは、ftp-folderたとえばフォルダー内のサブフォルダーでも機能し、次のftp-folder/test/image.pngようにアクセスできます。/test/image.png

2 番目の部分は、通常の「ファイルが存在しない場合は、/index.php に書き換える」だけです。

編集

余談ですが

OPは「これは機能しません」と述べました-まあ、試してくれてありがとう-この役立つコメントの後、回答を削除するところだったが、この投稿に取り組んだ後、提案された解決策が完全に機能していることを確認したので、一息ついて、デバッグのヒントをいくつか紹介することにしました。

これがうまくいかない場合は、次のように述べています。

  • 「隠し」アップロードフォルダーが実際に呼び出されていることを確認してください。ftp-uploadまた、Linuxでは大文字と小文字が区別されます
  • Web サーバーが .htaccess ファイルを読み取るように構成されていることを確認します。

    • 仮想ホスト構成のAllowOverrideディレクティブ。
    • 通常の値はAllowOverride All
    • givemeanerror on無効なもの (例: ) を .htaccess に追加し、Web ブラウザでページを開くことで簡単にテストできます。.htaccess ファイルが読み取られると、ブラウザーに 500 Internal Server エラー メッセージが表示されます。テスト環境がない場合は、test サブフォルダーでこれを行うことができます
  • 上に投稿した構成は、 (ftp-upload フォルダー内ではなく) に配置されているファイルのコンテンツ全体を置き換える必要があります。デバッグのために、ラッパーを削除することもできます。.htaccessDOCUMENT_ROOT<IfModule>

  • テストのために、画像ファイルを ftp-upload フォルダーにコピーします。test.png

  • それでもブラウザでhttp://yourdomain.com/test.pngにアクセスできない場合は、このリクエストのレスポンス ヘッダーを確認してください。
  • 応答ヘッダーを監視する方法がわからない場合は、http://www.webconfs.com/http-header-check.phpにアクセスし、URLを入力http://yourdomain.com/test.pngして結果をコピーします。

お役に立てれば :)

于 2013-01-22T21:43:07.270 に答える
1

あなたのニーズに基づいて私が作成したこのスペースをチェックしてくださいhttp://dev.wadakkir.org/test/

これは前のスペースの構造です。

それはあなたが必要とするものですか?

もしそうなら、次の .htaccess ファイルを使用してこの動作を実行できます

Options +Indexes
RewriteCond  %{REQUEST_URI} !^/test/subF/
RewriteRule ^(.*)$ /test/subF/$1

あなたの場合、それは次のようなものでなければなりません:

Options +Indexes
RewriteCond  %{REQUEST_URI} !^/ftp-upload/
RewriteRule ^(.*)$ /ftp-upload/$1

役に立てば幸いです。そうでない場合は、もう一度やり直してください:)

アップデート

私の以前のコメントで示唆されているように、以下は使用するための高速に記述されたゲートウェイです。実行サンプルについては、 http://dev.wadakkir.org/test/を参照してください(しばらくここに置いておきます)。

以下は私が使用したソースコードです:

index.php

<?php

require_once 'gateway.php';

echo "<h1>Hello World!</h1>";
?>
Existing file names are:
<ul>
    <li>01_Content_Of_Test_Folder.png</li>
    <li>02_Content_Of_SubF_Folder.png</li>
    <li>2ndTst.txt</li>
    <li>tst.txt</li>
</ul>

ゲートウェイ.php

<?php

if( !empty($_GET['cf']) ){
$filename = "./subF/".$_GET['cf'];
if( is_file( $filename ) )
    dwldFunction($filename);
else{
    // TODO change this to what ever you want
    die("File not found ($filename)");
    }
    exit(1);
}


function dwldFunction( $fName ) {
// detect mime type
$mime = getMime( $fName );

header('Pragma: public');   
header('Expires: 0');       
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: '. $mime );
header('Content-Disposition: attachment; filename="'.basename($fName).'"');
header("Content-Length: " . filesize($fName));
header('Connection: close');

readfile( $fName );
}

function getMime( $fName ) {
    $r = pathinfo($fName);
    $m ;
    //TODO: 
    // complete the following list or use
    //$finfo = finfo_open(FILEINFO_MIME_TYPE);
    //finfo_file($finfo, $fName);
    //finfo_close($finfo);
    // @: http://php.net/manual/en/function.finfo-file.php
    switch ( $r['extension'] ){
        case "pdf":
            $m = "application/pdf";
            break;
        case "txt":
            $m = "text/plain";
            break;
        case "png":
                $m = "image/png";
            break;
    }
    return $m;
}

.htaccessの内容は次のとおりです。

Options +Indexes

RewriteCond %{REQUEST_URI} !^/test/subF/
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !subF
RewriteRule ^(.*)$ /test/index.php?cf=$1

このリンクから完全なソースコードをダウンロードできます

于 2013-01-28T12:51:29.577 に答える
0

これらの答えはすべて、私にはあまりにも複雑すぎるように思えます

次のようなディレクトリ構造があると仮定します。

/ home / user / www/{ウェブルート}/home / user / ftpuploadfolder/{ftpフォルダー}

そのフォルダをapache経由で/home/ user / www/folderとして表示する必要があります

シンボリックリンクを作成してみませんか?ln -s / home / user / ftpuploadfolder / / home / user / www / publicfolder /

このようにすることで、リンクされたフォルダーに対して個別のアクセス許可を設定できます。たとえば、パブリックフォルダーのみへのapacheアクセス(パブリック読み取り/書き込みなどではない)とftpuploadfolderへのftpアクセスのみが可能です。

于 2013-01-24T09:55:23.527 に答える
0

PHP ファイルを使用して必要なファイル (この場合はサブフォルダー内) を読み取り、それをユーザーに出力します。しかし、あなたの解決策は次の答えにあると思います:

https://stackoverflow.com/a/1851873/1794894

于 2013-01-28T21:58:26.390 に答える
0
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^yourhost.com|^www.yourhost.com
RewriteCond %{REQUEST_URI} !^/new
RewriteRule ^(.*)$ new/$1 [L]

この意味

www.yourhost.com/new/

実際には

www.yourhost.com

于 2013-01-29T21:10:47.387 に答える