我已经研究了一整天,我以为自己已经掌握了正则表达式,但我不再相信自己掌握了。我到处搜索,阅读了一些关于 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 等中……