Apache mod_rewrite正在忽略子目录中的规则
想要重写行为(内部重写!) Full.htaccessApache 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
# 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/
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]