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

时间:2014-12-22 17:54:00

标签: php apache .htaccess mod-rewrite url-rewriting

我刚才在stackoverflow上询问了this question的部分内容,这很有效: ES

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

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

根/ 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文件。

根/我的-网站/ 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/这样的链接只是“被忽视”而实际上并不存在。

但是如果我现在在我的服务器上运行这个网站并且由于我的root中的main-htaccess文件,我的子目录中的RewriteConditions不起作用,我得到一个“未找到”

我该如何协同工作?

2 个答案:

答案 0 :(得分:0)

这样做:

<强>的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]

答案 1 :(得分:0)

当问题被删除时,我在serverfault上发布了这个帖子。你已经有了一个合适的答案,但我想我还会在这里发帖,所以你可以对此有一些解释:

如果子文件夹中的.htaccess中有mod_rewrite指令,则只应用那些指令,不会应用父文件夹的指令。您可以使用

使父文件夹的.htaccess中的规则适用
RewriteOptions Inherit
子文件夹中的

指令。但后来它可能变得有点凌乱。您需要记住,在子文件夹中重写规则后,应用了父文件夹中的规则。最好只使用1 .htaccess文件中提出的解决方案。

你的最后一次RewriteRule搜索&#34; /&#34;在开始时,它们在每个目录上下文中从不具有,但在每个服务器上下文中具有。因此,如果您在.htaccess文件中(每个dir上下文),那么将使用在开头没有/的字符串进行比较。请参阅有关RewriteRule

的文档