.htaccess - 将子文件夹重写为父级,可访问父级

时间:2015-05-05 21:03:08

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

我正在尝试创建一个RewriteRule,它允许我隐藏URL中的子文件夹名称。这看起来很简单,虽然我还想保留对父文件夹中文件的访问权限,但我无法弄清楚如何实现这一点以及这是否可行。为了使它更清晰,我的文件树如下:

[root]
 L[parent]
   file1
   L[subfolder]
     file2

所以我要做的是,能够在http://example.com/parent/subfolder/file2访问http://example.com/parent/file2的同时将http://example.com/parent/file1重写为<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /pico/ RewriteRule sitemap\.xml \?sitemap RewriteRule ^parent?$ parent/ [R=301,L] ## Redirects the old file to the index with the same name RewriteRule ^parent/subfolder/?$ parent/ [R=301,L] ## Redirects the index of the subfolder to the parent RewriteRule ^old-folder/?$ parent/subfolder/new-file1 [R=301,L] ## Redirects the old index to a new file in the subfolder RewriteRule ^old-folder/old-file parent/new-file [R=301,L] ## Redirects the files in the old folder to a new file in the parent RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] RewriteRule ^parent/([^/]+)/?$ parent/subfolder/$1 [L] </IfModule> # Prevent file browsing Options -Indexes 。到目前为止,我找到了可能的解决方案herehere,但它们都没有按预期工作。我也看了一下Apache Aliases,但我不确定在这种情况下我可以使用它们。有什么建议吗?

修改:这是当前的.htaccess:

$_SERVER['DOCUMENT_ROOT'];

带注释的规则只是示例,因为我在更改结构时将旧内容移动到新网站,因此有更多重复规则,就像上面的示例一样。

1 个答案:

答案 0 :(得分:0)

你刚试过这个吗?把它放在root中的.htaccess文件中。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^parent/([^/]+)/?$ /parent/subfolder/$1 [L]

修改

根据你的评论,我正在解释我上面提到的内容。您说您希望parent/subfolder中的所有内容都被读取,就好像它直接位于parent位置一样。这意味着http://example.com/parent/file2确实存在 NOT 。因为它实际上存在于http://example.com/parent/subfolder/file2

这是条件的目的。它会检查以确保/parent/whatever的任何请求不是真实文件而不是真实目录,如果是,则将其重写为/parent/subfolder/whatever。所以这就是你要求的,但你没有像我给你的那样使用规则。你所做的只是将rewriterule行添加到文件的底部,它将永远不会执行,因为这个规则

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteRule . index.php [L]

将在RewriteRule ^parent/([^/]+)/?$ /parent/subfolder/$1 [L]之前执行,然后它将永远不会运行。在提出问题时,您不能只提供.htaccess规则的一部分,因为根据订单的不同,某些规则会先于其他规则。你需要像现在一样提供所有规则。

所以你需要改变你的规则。

 RewriteRule sitemap\.xml \?sitemap
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^parent/([^/]+)/?$ /parent/subfolder/$1 [L]
 RewriteRule ^parent?$ parent/ [R=301,L] ## Redirects the old file to the index with the same name
 RewriteRule ^parent/subfolder/?$ parent/ [R=301,L] ## Redirects the index of the subfolder to the parent
 RewriteRule ^old-folder/?$ parent/subfolder/new-file1 [R=301,L] ## Redirects the old index to a new file in the subfolder
 RewriteRule ^old-folder/old-file parent/new-file [R=301,L] ## Redirects the files in the old folder to a new file in the parent
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d 
 RewriteRule . index.php [L]