重写条件以比较Request_URI中的顶级目录

时间:2011-05-24 19:27:14

标签: apache .htaccess mod-rewrite

我的网站上有几个客户端,每个客户端都设置了大致相似的网站。这些客户帐户的文件夹是为了组织目的而设置的:

mydomain.com/client/sampleclient
mydomain.com/client/anotherclient

我希望他们能够通过简单/ sampleclient或/ anotherclient访问他们的内容。为此,我已将此规则添加到我的根.htaccess(感谢Paolo Stefan):

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

这在重定向根目录时效果很好。 IE,mydomain.com/sampleclient完美地重定向到mydomain.com/client/sampleclient。但是,它不适用于客户端目录中的请求。类似的东西:

mydomain.com/sampleclient/orders

检查client / sampleclient / orders是否是一个目录,它不是(我在客户端目录中使用单独的url重写),因此不应用该规则。有没有办法将正则表达式应用于REQUEST_URI或其他东西,以便我在应用规则之前只检查request_uri的顶级目录是否存在?

1 个答案:

答案 0 :(得分:2)

RewriteCond可以将匹配的一部分作为其第一个参数,因此您可以使用

RewriteCond %{DOCUMENT_ROOT}/client/$1 -d
RewriteRule ^(.+?)/(.*)$ /client/$1/$2 [L,QSA]

Apache将检查%{REQUEST_URI}是否以非零长度的目录名开始(^)后跟斜杠,然后它将使用第一个匹配来查看该名称的目录是否存在witih {{ 1}}。如果是这样,重写规则将应用斜杠后面的任何内容(即使没有)。

E.g。如果用户请求页面

%{DOCUMENT_ROOT}/client/

Apache会检查mydomain.com/sampleclient/orders 是否存在并且是一个目录,如果是,则会加载

%{DOCUMENT_ROOT}/client/sampleclient

通常,它会加载 mydomain.com/client/sampleclient/ [在第一次斜杠后出现的任何内容]

如果您不需要它来加载mydomain.com/client/sampleclient/orders 并想要在mydomain.com/client/sampleclient/orders目录中应用重写规则,请使用

sampleclient

也就是说,从替换字符串中删除RewriteRule ^(.+?)/(.*)$ /client/$1/ [QSA] ,在方括号内删除$2标记。

有关详细信息,另请参阅these Apache docs