我正在尝试编写一个 Apache mod_rewrite,它可以从子域中获取信息,并在域之后将其作为几个变量传递给 PHP 脚本。
这是我目前所拥有的,通过它我可以获取子域名或 URL 参数。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^./]+)\.domain\.com/([a-zA-Z0-9/-]+)$
RewriteCond %1 !=www
RewriteRule ^ redirect.php?subdomain=%1&args=$2
RewriteRule ^/?([a-zA-Z0-9/-]+)$ redirect.php?args=$1 [L]
mod_rewrite 已启用,我们使用通配符 A 记录将所有流量指向此服务器 *.domain.com
此外,如果这篇文章被发布在其他地方,我深感抱歉,过去一个月我一直在断断续续地尝试解决这个问题,但却没有找到答案,也没有在任何地方找到答案。
答案1
正如 Shane Madden 已经提到的,第一个RewriteCond
看起来不会匹配任何内容。原因有两个:首先,第一个.
没有转义;其次,%{HTTP_HOST} 变量不包含任何斜杠,因此后面的整个部分domain\.com
不会匹配任何内容。
RewriteCond %{HTTP_HOST} ^([^./]+)\.domain\.com/([a-zA-Z0-9/-]+)$
我以前从未在 RewriteCond 的左侧使用过 %1。除非您确定这有效,否则如果您遇到更多问题,请尝试删除此行以消除它可能的原因。那里也不应该有符号=
。简单!www
就是您想要的。如果您确实遇到此行的问题,请将其更改为使用变量%{HTTP_HOST}
而不是 %1。
RewriteCond %1 !=www
此 RewriteRule 的替换中的模式$2
中没有匹配的括号集,因此它将为空。您可能希望为此添加一个更大的模式。如果它只有一组匹配的括号,那么 $1 就是您想要的,即使替换中已经有 %1。我怀疑/redirect.php...
如果您在配置文件中而不是在 .htaccess 中执行此操作,您也会想要这样做。
RewriteRule ^ redirect.php?subdomain=%1&args=$2
另外,我想补充^
一点,简单的匹配很容易产生循环。一定要小心。