Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess通配符重定向修复程序_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess通配符重定向修复程序

.htaccess通配符重定向修复程序,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我正在使用以下代码将通配符子域(*.domain.com)重定向到/users中的相应文件夹,并将/users文件夹中的直接请求重定向到子域版本: 保护对通配符域文件夹的直接访问: RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC] RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L] 处理通配符子域请求: RewriteCond %{REQU

我正在使用以下代码将通配符子域(*.domain.com)重定向到/users中的相应文件夹,并将/users文件夹中的直接请求重定向到子域版本:

保护对通配符域文件夹的直接访问:

RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]
处理通配符子域请求:

RewriteCond %{REQUEST_URI} !^/users/ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
RewriteCond %1 !=www [NC]
RewriteRule ^(.*)$ /users/%1/$1 [L]
这段代码运行得很好,但是有两个问题我似乎无法解决

  • 出现以下情况似乎是因为请求URI上没有尾随斜杠:

    username.domain.com/sub1=>username.domain.com/users/username/sub1 username.domain.com/sub1/=>username.domain.com/sub1/

  • 用户目录仍然可以使用子域直接访问:

    username.domain.com/users/username/sub1=>起作用,不应该起作用

  • 我很茫然,如果有人有任何想法,我将不胜感激


    谢谢大家!

    对于问题2,我认为您的第一条保护规则只需要重定向所有子域。它正在重定向www,但让username.domain.com按原样通过

    这将把任何直接访问请求重定向到用户路径

    RewriteCond %{HTTP_HOST} ^.+\.domain\.com$ [NC]
    RewriteRule ^users/([a-z0-9\-_\.]+)/?(.*)$ http://$1.domain.com/$2 [QSA,NC,R,L]
    
    我认为只要查找以domain.com结尾的任何主机(它甚至不处理子域,只处理domain.com)就可以简单一点(我没有测试这个…)

    对于问题1,我也被难住了,对不起。它的行为就像尾随斜杠不符合规则一样,所以它按原样通过了。但我希望它能像你希望的那样:

    username.domain.com/sub1/=>username.domain.com/users/username/sub1/

    也许可以尝试
    %{REQUEST\u URI}
    标记,而不是尝试捕获
    *
    。我看不出有什么区别,但也许会有帮助

    RewriteCond %{REQUEST_URI} !^/users/ [NC]
    RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
    RewriteCond %1 !=www [NC]
    RewriteRule .* /users/%1%{REQUEST_URI} [L]
    
    RewriteCond %{REQUEST_URI} !^/users/ [NC]
    RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$ [NC]
    RewriteCond %1 !=www [NC]
    RewriteRule .* /users/%1%{REQUEST_URI} [L]