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

Mod rewrite 重写链接规则,冲突的文件和文件夹,mod-rewrite,hyperlink,subdomain,rewrite,Mod Rewrite,Hyperlink,Subdomain,Rewrite,例如,我们一直在尝试使用重写规则来解决这个问题,该规则将子域分配给同名的根目录 ddd.example.com将链接到“/\u projects/ddd”目录,该目录工作正常,我对此没有任何问题,问题是我在根目录“/”中的任何文件或目录都可以从子域ddd.example.com访问 下面是一个示例目录结构 example.com=“/” “index.php” ddd.example.com=“/\u项目/ddd” 没有文件 例如,如果我访问ddd.example.com/index.p

例如,我们一直在尝试使用重写规则来解决这个问题,该规则将子域分配给同名的根目录

ddd.example.com将链接到“/\u projects/ddd”目录,该目录工作正常,我对此没有任何问题,问题是我在根目录“/”中的任何文件或目录都可以从子域ddd.example.com访问

下面是一个示例目录结构

example.com=“/”

  • “index.php”
ddd.example.com=“/\u项目/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] 

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

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

假设存在一个
/\u projects/sub/index.php

您的
RewriteCond
-s将看到
/\u projects/sub/index.php
作为文件存在,然后跳过重写。但是如果跳过重写,则不会重定向到
/\u projects/sub/
。那么,在这种情况下获取的是什么文档呢?你猜对了,
/index.php

您应该无条件地将这些子域重定向到其正确的位置(只需进行循环检查)


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

如果你的
重写失败了怎么办?然后,URL就会失效,不会被重写。因此它访问文档根。我只需要为每个受支持的子域创建单独的
VirtualHost
条目。(有多少人?)

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

假设存在一个
/\u projects/sub/index.php

您的
RewriteCond
-s将看到
/\u projects/sub/index.php
作为文件存在,然后跳过重写。但是如果跳过重写,则不会重定向到
/\u projects/sub/
。那么,在这种情况下获取的是什么文档呢?你猜对了,
/index.php

您应该无条件地将这些子域重定向到其正确的位置(只需进行循环检查)


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

我的重写尝试就是这样做的

伪代码:

if (subdomain-directory != exists)
    redirect them to the home page
else
    rewrite the request for the subdomain
我只能用两条规则来实现这一点,我还没有找到任何其他方法来实现这一点,所以这是我的尝试

所讨论的条件实际上运行良好,如果我在/_projects/sub目录中有一个index.php,那么它将使用该文件,并对我放入其中的任何其他文件使用相同的文件


我完全不知道如何用mod_rewrite来完成这一点,我已经在这几个星期的大部分时间里玩弄了它,但毫无结果,无休止地寻找可能的解决方案,也没有取得任何进展。

我试图重写的目的就是要做到这一点

伪代码:

if (subdomain-directory != exists)
    redirect them to the home page
else
    rewrite the request for the subdomain
我只能用两条规则来实现这一点,我还没有找到任何其他方法来实现这一点,所以这是我的尝试

所讨论的条件实际上运行良好,如果我在/_projects/sub目录中有一个index.php,那么它将使用该文件,并对我放入其中的任何其他文件使用相同的文件


我完全不知道如何用mod_rewrite实现这一点,我在这几周的大部分时间里都在玩弄它,但毫无结果,无休止地寻找可能的解决方案,也没有取得任何进展。

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

##### 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]

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

##### 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]