0

ファイルを提供し、サーバーのディレクトリ構造を隠すために、アンカー タグと組み合わせて .htaccess を使用しています。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /_docu/clients/$1/$2/$3.pdf [NC,L]

たとえば、すべてのファイルが/public_html/_docu/clients/そのフォルダーの下および内部に保存され、すべてのクライアントがリストされ、次に各クライアントの下にプロジェクトがリストされます。ただし、ファイルのアンカー タグは読み取り専用です。

http://mydomain.com/client-name/proj-name/docname.pdf

(/_docu/clients/ が省略されています - これには十分な理由があります)。上記の .htaccess はを取得しclient-name、正しいフォルダーから提供します。proj-namedocname

http://mydomain.com/_docu/clients/client-name/proj-name/docname.pdf

アドレスバーに誤った(隠された)ディレクトリ構造を保持しながら。

ドキュメントが存在しないというエラー状態を処理したいと考えています。これは決して起こらないはずですが、起こる可能性があります。誰でもこれに対処する方法を提案できますか? 「if fileexist($1/$2/%3.pdf)」に機能的に似たものを.htaccessファイルで何らかの形で構築できますか?


編集:

以下のJLの回答には調査と実験が必要だったため、回答が遅れました。ジョン、正しい方向への穏やかなプッシュに対して感謝しますが、まだ機能していません。これが私が試したことです:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# check if the requested file exists in the "_docu/clients" directory
RewriteCond %{DOCUMENT_ROOT}/_docu/clients/$1/$2/$3.pdf -f
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_docu/clients/$1/$2/$3.pdf [NC,L]
RewriteRule ^(.*)$ /errors/404.php [L]

それがすべきことは次のとおりだと思いました:

  1. http://mydomain.com/_docu/clients/$1/$2/$3.pdf存在しない場合、
  2. ページに移動http://mydomain.com/errors/404.php

実際の結果は、「内部サーバー エラー」メッセージです。


編集2:

最新の変更:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$
RewriteCond %{DOCUMENT_ROOT}/_data/cli/%1/%2/%3.pdf -f
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_data/cli/$1/$2/$3.pdf [NC,L]
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(.*)$ /metshare/404.php [L]

この問題は、正当なページも 404.php に誘導されることです。

将来の読者へのメッセージ:

上記の懸念事項はすべて、Jon Lin の最終的な回答で対処されています。問題が検出されると、彼はそれが完璧で機能するソリューションになるまで回答を修正しました。バージョンを比較したい人のために、(予定外の学習機会) 内にいくつかの良い ULO があるため、上記はそのままにしておきます。

4

1 に答える 1

1

次のような条件を使用する必要があります。

RewriteCond %{DOCUMENT_ROOT}/_docu/clients%{REQUEST_URI} -f

ルールが次のようになります。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# check if the requested file exists in the "_docu/clients" directory
RewriteCond %{DOCUMENT_ROOT}/_docu/clients%{REQUEST_URI} -f
RewriteRule ^ /_docu/clients%{REQUEST_URI} [L]

編集:問題の編集への応答

あなたはこれを行うことはできません:

RewriteCond %{DOCUMENT_ROOT}/_docu/clients/$1/$2/$3.pdf -f

$ 1 / $ 2 / $ 3の後方参照はまだ存在しないため、のグループ化で一致しますがRewriteRule、この時点ではまだ発生していません。しかし、あなたはこのようなことを試すことができます:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# check if the requested file exists in the "_docu/clients" directory
RewriteCond %{REQUEST_URI} ^/([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$
RewriteCond %{DOCUMENT_ROOT}/_docu/clients/%1/%2/%3.pdf -f
RewriteRule ^([a-z0-9])/([a-z0-9])/([a-z0-9]*).pdf$ /_docu/clients/$1/$2/$3.pdf [NC,L]

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /errors/404.php [L]

%{REQUEST_URI}基本的に、前回の対戦を作成してから、次の後方参照RewriteCondを使用します。%NRewriteCond

于 2012-09-17T15:45:59.170 に答える