【问题标题】:mod_rewrite is ignoring rules in subdirectoriesmod_rewrite 忽略子目录中的规则
【发布时间】:2011-06-24 03:25:52
【问题描述】:

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

http://<subdomain>.domain.tld/<path> -> /<subdomain>/<path>
http://www.domain.tld/path/file.php  -> /www/path/file.php
http://project.domain-tld/index.php  -> /project/index.php

文件夹结构:

/                        root
    .htaccess
    /www                 www.domain.tld
        index.php
        /www
            file.php
        /foo
            /bar
                file.php
    /project             project.domain.tld
        index.php
        someRandomFiles
    /somesubdomain       somesubdomain.domain.tld
        index.php
        someRandomFiles
    /anothersubdomain    anothersubdomain.domain.tld
         index.php
         someRandomFiles

完整的.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]

我的.htaccess 似乎有效。你可以在这里进行现场测试:

但是子目录中有一些奇怪的行为。如果请求路径中的第一个目录与子域本身同名,mod_rewrite 似乎会忽略该规则。例如:

  • http://www.domain.tld/foo/bar/file.php -&gt; /www/foo/bar/file.php - Fine!
  • http://www.domain.tld/ -&gt; /www/ - Fine!
  • http://www.domain.tld/www/ -&gt; /www/ - Should be: /www/www/
  • http://www.domain.tld/www/www/ -&gt; /www/www/ - Should be: /www/www/www/

对于另一个现场测试:

这条规则似乎被忽略了。

【问题讨论】:

  • 1) 你能告诉我你想达到什么目标吗?请展示几个示例(从 url => 到 url)。 2)这个 .htaccess 位于哪里 - 我猜在根文件夹中,而您在子域文件夹中没有这样的文件?
  • 好的,我有足够的信息。我只需要找点时间去做。希望我很快就会有一些空闲时间,否则我将不得不在下班后(在 6 小时左右)回来。我希望你能等:)

标签: apache .htaccess mod-rewrite subdomain


【解决方案1】:

这是我能想出的唯一一个好的规则,否则在初始重写之后(这很容易)它会进入循环(这就是问题所在)。例如: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/

不幸的是,我还没有找到绕过它的方法。如果您愿意,可以尝试将您的规则与我的规则结合起来。

【讨论】:

  • 感谢您的解决方案 - 如果我将子域移动到名为“子域”的子文件夹中会有帮助吗?这样我所有的子域都不在/,而是在/subdomains/。
  • @silvinci 它应该有助于解决最后一点(我回答的最后两段)。但是您应该尝试..如果不尝试自己,真的很难保证这一点。
猜你喜欢
  • 2013-01-13
  • 2013-04-25
  • 2010-09-14
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多