Mod重写目录检查

时间:2011-05-24 14:52:01

标签: apache .htaccess mod-rewrite

我的情况是我有几个客户,我希望每个客户都可以通过mydomain.com/clientname访问他们的网站。为了保持组织有序,我将客户端站点的实际文件存储在/ client / clientname中。我可以通过在我的.htaccess中添加大量的这些行来实现预期的效果:

RewriteRule ^client1(.*)$ /client/client1$1 [L]
RewriteRule ^client2(.*)$ /client/client2$1 [L]

我试图通过检查客户端目录是否存在于/ client中来以更干净的方式执行此操作。 (如果我确定它不是一个有效的文件或目录)。但由于某种原因,这似乎不起作用:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond /client/%{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ /client/$1 [L,QSA]

我错过了什么?

1 个答案:

答案 0 :(得分:3)

来自Apache mod_rewrite docs

<强> REQUEST_FILENAME

匹配请求的文件或脚本的完整本地文件系统路径,如果在引用REQUEST_FILENAME时服务器已经确定了该路径。否则,例如在虚拟主机上下文中使用时,其值与REQUEST_URI相同。

你的专栏:

RewriteCond /client/%{REQUEST_FILENAME} -d

似乎导致了这个问题,因为它使Apache寻找以下文件路径:

/client/[the whole filesystem path of requested file]

非常肯定不是你想要的。

您可以按照以下方式更正:

RewriteCond %{DOCUMENT_ROOT}/client%{REQUEST_URI} -d