重写链接规则,冲突的文件和文件夹

时间:2012-03-16 19:17:00

标签: mod-rewrite hyperlink subdomain rewrite

尝试使用重写规则解决此问题,该规则将子域分配给同名的根目录,例如。

ddd.example.com将链接到“/ _projects / ddd”目录,该工作正常,我没有遇到任何问题,问题是我可以访问根目录“/”中的任何文件或目录来自子域ddd.example.com。

这是一个示例目录结构

  

example.com =“/”

     
    
        
  • “的index.php”
  •     
  
     

ddd.example.com =“/ _projects / ddd”

     
    
        
  • 没有文件
  •     
  

因此,如果我访问ddd.example.com/index.php,它将解析为使用位于以下目录下的example.com/index.php文件。

这是.htaccess

的重写规则
# Skip rewrite if subdomain is www 
RewriteCond %{HTTP_HOST} !^www\. [NC] 

# Extract (required) subdomain to %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$

# Redirect to domain if requested URL does not resolve to existing subdirectory path
RewriteCond %{DOCUMENT_ROOT}/_projects/%1 !-d
RewriteRule (.*) http://example.com/ [NC,R=301]

# Skip rewrite if subdomain is www 
RewriteCond %{HTTP_HOST} !^www\. [NC]

# Extract (required) subdomain to %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com(:80)?$

# Skip rewrite if requested URL does not resolve to existing subdirectory path or file
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/_projects/%1/$1 -d
RewriteRule (.*) /_projects/%1/$1 [NC,L] 

3 个答案:

答案 0 :(得分:0)

如果RewriteConds失败怎么办?然后URL会通过而不会被重写。因此它访问文档根目录。我只想为每个受支持的子域创建单独的VirtualHost条目。 (有多少人?)

假设客户要求http://sub.example.com/index.php

假设存在/_projects/sub/index.php

您的RewriteCond - s会看到/_projects/sub/index.php作为文件存在,然后跳过重写。但是如果跳过重写,则没有重定向到/_projects/sub/。那么在那种情况下提取什么文件?你猜对了,/index.php

您应该无条件地将这些子域重定向到适当的位置(仅限于检查循环)。

为什么你把重写分成两个,一个做内部重定向?内部重定向不会将整个网址重写为example.com,因此它会保留在子域中。看起来你可以进入一个循环。

答案 1 :(得分:0)

我重写的尝试主要是这样做。

伪代码:

if (subdomain-directory != exists)
    redirect them to the home page
else
    rewrite the request for the subdomain

我只能用两条规则来完成,我没有找到任何其他方法来实现这一点,所以这是我的尝试。

有问题的条件实际上工作正常,如果我在/ _projects / sub目录中有一个index.php,那么它将使用该文件,并且对于我放在那里的任何其他文件也是如此。

我完全不知道如何通过mod_rewrite实现这一目标,我已经玩了几周的最佳时间无济于事,无休止地搜索可能的解决方案并且没有取得任何进展。

答案 2 :(得分:0)

解决了这个问题,似乎有一个循环问题正在打破重写。

##### Subdomain to subfolder
# Fix missing trailing slashes.
#RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
#RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
#RewriteCond %{DOCUMENT_ROOT}/%2%{REQUEST_URI}/ -d
#RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

# Rewrite sub domains.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.example\.com$ [NC]
RewriteRule ^(.*)$ /projects/%2/$1 [QSA,L]