我的网站上有几个客户,每个客户的网站设置基本相似。这些客户帐户的文件夹是出于组织目的而设置的,位于:
mydomain.com/client/sampleclient
mydomain.com/client/anotherclient
etc.
我希望他们能够简单地通过 /sampleclient 或 /anotherclient 访问他们的内容。为了实现这一点,我已将此规则添加到我的根 .htaccess 中(感谢保罗·斯特凡):
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 的顶级目录是否存在?
RewriteCond
可以将匹配的一部分作为其第一个参数,因此您可以使用
RewriteCond %{DOCUMENT_ROOT}/client/$1 -d
RewriteRule ^(.+?)/(.*)$ /client/$1/$2 [L,QSA]
Apache 将检查 %{REQUEST_URI} 是否启动(^
) 具有非零长度的目录名称后跟斜杠,那么它将使用第一个匹配项来查看该名称的目录是否存在%{DOCUMENT_ROOT}/client/
。如果是这样,重写规则将应用斜杠后面的任何内容(甚至什么都不应用)。
例如。如果用户请求该页面
mydomain.com/sampleclient/orders
Apache 将检查是否%{DOCUMENT_ROOT}/client/sampleclient
存在并且是一个目录,如果存在,则会加载
mydomain.com/client/sampleclient/orders
一般情况下会加载mydomain.com/client/sampleclient/[第一个斜线之后的内容].
如果您不需要加载它mydomain.com/client/sampleclient/orders
并希望在其中应用重写规则sampleclient
目录、使用
RewriteRule ^(.+?)/(.*)$ /client/$1/ [QSA]
也就是说,删除$2
来自替换字符串,以及L
方括号内的标志。
也可以看看这些 Apache 文档了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)