htaccess mod-rewrite:从根目录链接到子目录 - 忽略子目录中的目录


htaccess mod-rewrite: link to subdirectory from root - neglect dirs in subdirectory?

我不久前在stackoverflow上问了这个问题的一部分,这很完美:es

我有一个多域服务器,每个目录都对应于一个域名。但是,我的主域名 www.mydomain.com 也是我服务器上的一个目录,不会自动链接到。

这就是为什么我在网站的根目录中使用它的原因......

root/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/my-website/
RewriteCond %{DOCUMENT_ROOT}/my-website%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/my-website%{REQUEST_URI} -d
RewriteRule ^(.*)$ /my-website/$1 [L]

现在,当我调用 www.my-website.com 时,它会自动运行/my-website目录。那就好。但是在这个目录中,我有另一个包含此内容的 .htaccess 文件。

root/my-website/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^'.]+)$ $1.php [NC,L]
RewriteRule ^/projects/(.+?'.php)$ /$1 [L,NC]
RewriteRule ^/jobs/(.+?'.php)$ /$1 [L,NC]
RewriteRule ^(/downloads/.+)/?$ assets/$1 [L,NC]

因此,这意味着对于这个网站来说,像/projects/这样的链接只是"被忽视",实际上并不存在。

但是,如果我现在在我的服务器上运行这个网站,并且由于我的根目录中的主htaccess文件,我的子目录中的重写条件不起作用,我得到一个"未找到">

我怎样才能使它协同工作?

这样说:

DocumentRoot/.htaccess:

RewriteEngine On
RewriteBase /
RewriteRule ^projects/(.+?'.php)$ /$1 [L,NC]
RewriteRule ^jobs/(.+?'.php)$ /$1 [L,NC]
RewriteRule ^(downloads/.+)/?$ assets/$1 [L,NC]
# add .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1'.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [L]
RewriteCond %{REQUEST_URI} !^/my-website/
RewriteCond %{DOCUMENT_ROOT}/my-website%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/my-website%{REQUEST_URI} -d
RewriteRule ^(.*)$ /my-website/$1 [L]
/

my-website/.htaccess:

RewriteEngine On
RewriteBase /my-website/
# add .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/my-website/$1'.php -f [NC]
RewriteRule ^(.+?)/?$ $1.php [L]

当问题被删除时,我正在服务器错误上发布这个。你已经有一个有效的答案,但我想我仍然会在这里发布这个,所以你可以对此有一些解释:

当您在子文件夹的 .htaccess 中有mod_rewrite指令时,将仅应用这些指令,不会应用父文件夹的说明。您可以使用

RewriteOptions Inherit

子文件夹中的指令。但随后它可能会变得有点混乱。并且您需要记住,父文件夹中的规则是在子文件夹中的重写规则之后应用的。最好使用仅在 1 个 .htaccess 文件中提出的解决方案。

您的最后 3 个 RewriteRule 在开头搜索"/",它们在每个目录上下文中从未有过,但在每个服务器上下文中都有。因此,如果您在 .htaccess 文件中(每个目录上下文(,则使用开头没有/的字符串进行比较。请参阅有关重写规则的文档。