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
Apache mod_rewrite正在忽略子目录中的规则_Apache_.htaccess_Mod Rewrite_Subdomain - Fatal编程技术网

Apache mod_rewrite正在忽略子目录中的规则

Apache mod_rewrite正在忽略子目录中的规则,apache,.htaccess,mod-rewrite,subdomain,Apache,.htaccess,Mod Rewrite,Subdomain,想要重写行为(内部重写!) Full.htaccess # Unicode AddDefaultCharset utf-8 # Activate mod_rewrite RewriteEngine on RewriteBase / # Subdomains # Extract (required) subdomain (%1), and first path element (%3), discard port number if present (%2) RewriteCond %{HT

想要重写行为(内部重写!)

Full.htaccess

# Unicode
AddDefaultCharset utf-8

# Activate mod_rewrite
RewriteEngine on
RewriteBase /

# Subdomains
#  Extract (required) subdomain (%1), and first path element (%3), discard port number if present (%2)
RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^([^.]+)\.janbuschtoens\.de(:80)?<>/([^/]*) [NC]
#  Rewrite only when subdomain not equal to first path element (prevents mod_rewrite recursion)
RewriteCond %1<>%3 !^(.*)<>\1$ [NC]
#  Rewrite to /subdomain/path
RewriteRule ^(.*) /%1/$1 [L]
#Unicode
AddDefaultCharset utf-8
#激活mod_重写
重新启动发动机
重写基/
#子域
#提取(必需)子域(%1)和第一个路径元素(%3),丢弃端口号(如果存在)(%2)
重写cond%{HTTP\u HOST}%{REQUEST\u URI}^([^.]+)\.janbuschtoens\.de(:80)?/([^/]*)[NC]
#仅当子域不等于第一个路径元素时重写(防止mod_重写递归)
重写秒%1%3^(.*)\1$[NC]
#重写到/子域/路径
重写规则^(.*)/%1/$1[L]
我的
.htaccess
似乎正常工作。您可以在此处进行现场测试:

  • 重写到
    /test/
  • 重写到
    /www/
但是在子目录中有一些奇怪的行为<如果请求路径中的第一个目录与子域本身同名,则code>mod_rewrite似乎会忽略该规则。例如:

  • http://www.domain.tld/foo/bar/file.php  ->/www/foo/bar/file.php-很好
  • http://www.domain.tld/                  ->/www/-很好
  • http://www.domain.tld/www/              ->/www/-应该是:/www/www/
  • http://www.domain.tld/www/www/          ->/www/www/-应该是:/www/www/www/
对于另一个现场测试:

  • 重写到
    /test/
  • 重写到
    /test/

这条规则似乎被忽略了。

这是我能想到的唯一一条好规则,否则在初始重写(这很容易)之后,它就会进入循环(这就是问题所在)。例如:
www.domain.com/www/123.png
被正确重定向到
/www/www/123.png
,但随后转到下一个循环,在那里它被重定向到
/www/www/www/123.png
,然后一次又一次

只有当最终文件名确实存在时才会调用此规则

RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d
RewriteRule ^(.*)$ /%1/$1 [QSA,L]
例如:如果您请求
www.domain.com/www/123.png
,并且存在文件/文件夹
WEBSITEROOT/www/www/123.png
,则将重写该文件,否则将一无所获

这里也一样:如果您请求
meow.domain.com/
。。但是,如果你的驱动器上没有
WEBSITEROOT/meow/
文件夹,它将一事无成

请注意,如果您有与子域同名的子文件夹,这仍然没有多大帮助。例如:如果您请求
www.domain.com
,则应将其重写为
WEBSITEROOT/www/
。。。但是如果您还有
WEBSITEROOT/www/www/
,那么(由于循环),它将被重写为
WEBSITEROOT/www/www/


不幸的是,我还没有找到绕过它的方法。如果你愿意,你可以试着把你的规则和我的规则结合起来。

1)你能告诉我你想达到什么目的吗?请给出几个例子(从url=>到url)。2) 这个.htaccess的位置--我猜是在根文件夹中,而你在子域文件夹中没有这样的文件?好的,我有足够的信息。我只是需要找点时间做这件事。希望不久我会有一些空闲时间,否则我将不得不在下班后(大约6个小时后)重新开始这项工作。我希望您可以等待:)谢谢您的解决方案-如果我将我的子域移动到名为“子域”的子文件夹中,会有帮助吗?因此,我的所有子域都不在/中,而是在/subdomains/@silvinci中,这应该有助于解决最后一点(我答案的最后两段)。但是你应该试试。。如果不亲自尝试,就很难保证这一点。
# Unicode
AddDefaultCharset utf-8

# Activate mod_rewrite
RewriteEngine on
RewriteBase /

# Subdomains
#  Extract (required) subdomain (%1), and first path element (%3), discard port number if present (%2)
RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^([^.]+)\.janbuschtoens\.de(:80)?<>/([^/]*) [NC]
#  Rewrite only when subdomain not equal to first path element (prevents mod_rewrite recursion)
RewriteCond %1<>%3 !^(.*)<>\1$ [NC]
#  Rewrite to /subdomain/path
RewriteRule ^(.*) /%1/$1 [L]
RewriteCond %{HTTP_HOST} ^(.+)\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d
RewriteRule ^(.*)$ /%1/$1 [QSA,L]