Apache mod_rewrite 子域和 URL 参数

Apache mod_rewrite 子域和 URL 参数

我正在尝试编写一个 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

另外,我想补充^一点,简单的匹配很容易产生循环。一定要小心。

相关内容