【问题标题】:htaccess mod rewrite - how to create virtual subdomains?htaccess mod rewrite - 如何创建虚拟子域?
【发布时间】:2011-03-28 04:49:19
【问题描述】:

我想通过以下方式通过htaccess创建虚拟子域。

输入:

http://testuser.domain.com/1/2/3/

应该被处理为:

http://www.domain.com/user.php?id=testuser&var1=1&var2=2&var3=3

但是,这个重写不应该使用 user.php,而是 index.php,以防有人进入:

http://www.domain.com or http://domain.com

这是我到目前为止得到的,但它似乎不起作用。 非常感谢 mod 重写专家的任何帮助。 提前致谢。

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
RewriteRule ^(.*)/?(.*)/?(.*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
RewriteRule ^(.*)/?(.*)/?(.*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]

【问题讨论】:

    标签: .htaccess mod-rewrite subdomain


    【解决方案1】:

    您的规则实际上非常接近于按照您的意愿行事。我能看到的唯一问题是您的两个 RewriteRule 语句的测试模式。目前,您有

    RewriteRule ^(.*)/?(.*)/?(.*)/?$ ...
    

    ...恰好相当于这个:

    RewriteRule ^(.*)$
    

    这是因为第一个捕获组之后的所有内容都无法匹配,但仍被视为匹配,因此第一个组是贪婪的,可以匹配整个输入字符串,而无需遵循模式的其他部分。

    由于捕获组无论如何都不应该捕获正斜杠,因为它们在这里被用作变量分隔符,所以直接的解决方法是将它们更改为 [^/]*,如下所示:

    编辑:我还修改了第二组中的RewriteCond设置,在/index.php的情况下忽略!-f条件,如果你请求子域之后没有任何东西就会发生这种情况域。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$ [NC]
    RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ index.php?var1=$1&var2=$2&var3=$3 [NC,QSA,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f [OR]
    RewriteCond %{REQUEST_URI} ^/index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} !^(www|mail).domain.com$ [NC]
    RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+).domain.com$ [NC] 
    RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?$ user.php?id=%2&var1=$1&var2=$2&var3=$3 [NC,QSA,L]
    

    【讨论】:

    • 嗨蒂姆,感谢您的快速回复。我更改了 htaccess 文件,但似乎问题可能出在其他地方。似乎 user.php 文件只有在输入变量时才会显示。举个例子:domain.com -->(显示 index.php)domain.com/1/2/3 -->(显示 index.php)testuser.domain.com/1/2/3 -->(显示 user.php)到目前为止还不错,但是:@987654324 @ --> (显示 index.php) 你知道我怎样才能做到,即使没有任何额外的变量,它总是会显示子域的 user.php 吗?最好的问候
    • 哦,哎呀,我没有测试的一个场景。我将进行编辑以解决这个问题。
    • 嗨蒂姆,我再次调整了它,但它似乎仍然不起作用。感谢您上次编辑 testuser.domain.com/index.php 现在正确显示 user.php 文件。但是,就像之前testuser.domain.com 一样,仍然显示 index.php 文件而不是 user.php 文件。
    • @Yah - 嗯,它在我的测试服务器上运行良好。您是否拥有对服务器配置的完全访问权限?
    • 是的,其中一个条件一定是由于某种原因失败了。如果删除 RewriteCond %{REQUEST_FILENAME} !-d 会发生什么?
    猜你喜欢
    • 2012-07-21
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多