RewriteCond backrefrence到另一个RewriteCond导致500

时间:2012-08-18 18:24:39

标签: apache .htaccess url-rewriting subdomain

我在cpanel中设置了一个* .mydomain.com子域名(cpanel,没有shell访问权限) 去任何地方.mydomain.com将我带到我为* .mydomain.com挂载的同一目录

所以当我在.htaccess中使用以下内容转到test.mydomain.com时,

正常运作的是:

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^(.+)\.(.+?\..+?)$ [NC]
RewriteCond %{REQUEST_URI} !^/test/(.+)?$
RewriteRule ^(.*)  /%1/$1

什么不起作用并且给出了500错误(刚刚用%1替换了测试):

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^(.+)\.(.+?\..+?)$ [NC]
RewriteCond %{REQUEST_URI} !^/%1/(.+)?$
RewriteRule ^(.*)  /%1/$1

我想要做的是允许动态设置子域,如果存在具有它名称的子目录。当我在.htaccess中对子域名 test 进行硬编码时,重写是优雅的,而不是当我使用backrefrence %1 时。

1 个答案:

答案 0 :(得分:2)

您不能在RewriteCond中使用%变量或反向引用作为正则表达式的一部分。您可以创建一个字符串,用于反向引用和#regex反向引用:

 RewriteCond %1:%{REQUEST_URI} !^([^:]+):/\1/(.+)?$

因此,您创建一个由主机匹配的子域组成的字符串,冒号,然后是URI,与正则表达式中的子域匹配,并使用\ 1引用它。

此外,您可能需要立即添加另一个%{HTTP_HOST}匹配,因为%1反向引用可能已重置,因为您无法反向引用匹配。