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

同时在地址栏中保留不正确(隐藏)的目录结构。

我希望处理不存在的文档的错误情况。这不应该发生,但它可能发生。任何人都可以提出处理这个问题的方法吗?可以在 .htaccess 文件中以某种方式构造类似于“if fileexist($1/$2/%3.pdf)”的功能吗?


编辑:

延迟响应作为 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

实际结果是“内部服务器错误”消息。


编辑二:

最新变化:

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 的反向引用还不存在,它们在 your 的分组中匹配,此时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然后%N在下面使用反向引用RewriteCond

于 2012-09-17T15:45:59.170 回答