使用.htaccess中的mod_rewrite隐藏多个动态命名的子目录

时间:2016-04-12 11:05:40

标签: .htaccess mod-rewrite

我无法在.htaccess文件中配置mod_rewrite规则来隐藏某些子目录。

输入:     https://example.com/hidden_sub1/hidden_sub2/additional_sub/file.php?lang=en-US

期望的输出:     https://example.com/en-US/additional_sub/file

我有一些代码可以让我隐藏一些东西,如果我具体命名它:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^GET\ /hidden_sub1/hidden_sub2/ [NC]
RewriteRule ^hidden_sub1/hidden_sub2/(.*) /$1 [L,R=301]
RewriteRule !^hidden_sub1/hidden_sub2/ hidden_sub1/hidden_sub2%{REQUEST_URI} [L]

但是,一旦我添加了以下语言子目录代码,它就停止了工作:

RewriteRule ^([a-z]{2}(-[A-Z]{2})?)/(.*) $3?lang=$1 [L,QSA]

此外,子目录的名称是动态的。 " hidden_​​sub1"可能是" random_name243"。但是,它们始终是前两个子目录。

那么如何在保留语言子目录的同时取出前两个随机命名的子目录?

我感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

从表格中更改网址

表格:

您可以使用以下重写规则

RewriteEngine On
RewriteBase /
#1)externally redirect "/hidden_sub1/hidden_sub2/foo.php?lang=bar" to "/bar/foo"
RewriteCond %{THE_REQUEST} /hidden_sub1/hidden_sub2/([^.]+)\.php\?lang=(.+)\sHTTP [NC]
RewriteRule ^ /%2/%1? [L,R=301]
#2)internally rewrite "/bar/foo" to "/hidden_sub1/hidden_sub2/foo.php?lang=bar"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ /hidden_sub1/hidden_sub2/$2.php?lang=$1 [NC,L]

在apache 2.2上测试过。和2.4。