如何使用 mod_rewrite 抽象带有子域名的 get 请求

如何使用 mod_rewrite 抽象带有子域名的 get 请求

我已经研究了一整天,我以为自己已经掌握了正则表达式,但我不再相信自己掌握了。我到处搜索,阅读了一些关于 mod_rewrite 的糟糕指南,但我还是被难住了。

我想让通话

subdomain.domain.com/u/satbirkira 

看起来和上面的完全一样,但是执行并显示以下内容

 domain.com/user.php?user_name=satbirkira?subdomain_given=subdomain

它应该非常简单,但我不明白。以下是我的想法:

RewriteCond %{HTTP_HOST} ^(.*)user.php\?user_name=(.*)$ [NC]

RewriteRule ^(.*)$ http://%1%{REQUEST_URI}/u/$3

我不知道为什么如果删除无用​​的捕获点(例如第一个 (.*)),某些 RewriteCond 会中断,但我已经学会了随波逐流。如果有人能解释为什么这种方法不正确、语法、捕获点和替换以及变量,我将不胜感激。

编辑

这与#4的目标类似http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html,“4) 将 yoursite.com/user.php?username=xyz 重写为 yoursite.com/xyz” 但答案对我来说毫无意义。

答案1

?user_name=satbirkira通过重写将该部分输入到 PHP 中可能会有点棘手,这取决于 PHP 访问数据的方式 - 某些应用程序最终会获取原始查询字符串,而不是重写的查询字符串。

但是,现在,让我们从这个开始,看看它会给我们带来什么。这应该在VirtualHost上下文中,如果它在上下文中,<Directory>或者.htaccess它需要调整。

RewriteRule ^/u/([^/]+)/?$ /user.php?user_name=$1 [L]

为了.htaccess你不应该使用它!):

RewriteRule ^u/([^/]+)/?$ user.php?user_name=$1 [L]

答案2

这应该可行:

RewriteCond %{HTTP_HOST}    (.*).domain.com
RewriteRule ^/u/([^/]+)/?$ /user.php?user_name=$1&domain_given=%1 [P]

记住首先测试 RewriteRule 的 LHS。然后在 RewriteCond 中将 LHS 与 RHS 进行匹配,如果匹配,则进行替换。在 RewriteCond 的 RHS 中捕获的字符串存储在 %1、%2 等中……在 RewriteRule 的 LHS 中捕获的字符串存储在 $+、ä2 等中……

相关内容