我正在尝试创建一个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
。到目前为止,我找到了可能的解决方案here和here,但它们都没有按预期工作。我也看了一下Apache Aliases,但我不确定在这种情况下我可以使用它们。有什么建议吗?
修改:这是当前的.htaccess:
$_SERVER['DOCUMENT_ROOT'];
带注释的规则只是示例,因为我在更改结构时将旧内容移动到新网站,因此有更多重复规则,就像上面的示例一样。
答案 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]