Con*_*ers 17 apache .htaccess mod-rewrite backreference wildcard-subdomain
我正在研究虚拟域系统.我有一个通配符DNS设置为*.loc,我正在尝试处理我的.htaccess文件.以下代码有效:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/example/
RewriteRule (.*) /example/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
但是,我希望这可以与我放入的任何内容一起使用.但是,我需要%{REQUEST_URI}对作为域的文本进行检查.我尝试使用此代码:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/%3/
RewriteRule (.*) /%3/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
但该行RewriteCond %{REQUEST_URI} !^/%3/导致我的代码抛出内部服务器错误.我理解这是因为我的代码中有%N,但有没有办法可以使用它?我需要这一行,否则,我的代码会因内部重定向而失败.
我希望这对某人有意义.我需要的是能够在后面的RewriteCond中反向引用RewriteCond.
Jon*_*Lin 42
这里有两件事你做错了.
首先,你的%{HTTP_HOST}正则表达式并不好.你需要逃避.点,否则他们将被视为"任何不是新行的角色".这实质上使%3反向引用成为TLD之前主机名的最后一个字符(例如http://blah.bar.loc,%3 = r).
其次,你不能在a的正则表达式中使用反向引用RewriteCond,只能使用左侧字符串,这是一种奇怪的限制.但是,您可以\1在正则表达式中使用引用,以便您可以构造一个聪明的左侧字符串来匹配.喜欢的东西%3::%{REQUEST_URI}然后你可以像这样匹配:!^(.*?)::/\1/?.这个正则表达式基本上是这样的:" 在:: 之前匹配并分组第一个文本块,然后确保::的后面的文本块以" 开头"./(first block)
所以你的规则应该是这样的:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule (.*) /%3/$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6030 次 |
| 最近记录: |