我们将 .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-name
并docname
从正确的文件夹中提供它:
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]
我认为应该做的是:
- 如果
http://mydomain.com/_docu/clients/$1/$2/$3.pdf
不存在, - 转到页面
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(计划外的学习机会)。