2012-03-06 38 views
4

是否有可能使.htaccess“理解”动态相对路径并将其正确重定向到它们?使用.htaccess重定向到动态相对路径?

我的设置去如下:

http://domain.com/htroot/aaa/xyz 
http://domain.com/htroot/bbb/xyz 
http://domain.com/htroot/ccc/xyz 

等。为了举例,“htroot”包含我需要修改的.htaccess。以下子页面(aaa,bbb,ccc)可以是任何a-z0-9名称,并且这些文件夹具有index.php(或任何其他要重定向到的.php)。 xyz应作为排序参数,请参阅下一部分。 xyz部分作为“物理”文件夹或文件不在文件系统中。

我需要做到如下:从

http://domain.com/htroot/aaa/ (or http://domain.com/htroot/aaa/index.php, either way) 

当你用URL访问

http://domain.com/htroot/aaa/xyz 

它获取的内容,其中的index.php踢 - >我可以得到xyz从REQUEST_URI解析并处理它以提供它指定的正确内容,而页面的URL自然保留为http://domain.com/htroot/aaa/xyz

到目前为止,我已经成功地退出这个功能,如果每个分段(AAA等)有它自己的.htaccess,但我需要一个地方只有位于htroot处理这一单一的.htaccess。我猜这可能与.htaccess中的$ 0参数有关,但不能确定。

回答

3

你可能要像这样执行的东西:

​​

如果第一个通配符匹配(.*)aaa和第二通配符匹配(.*)xyz(htroot/AAA/XYZ),它会得到

内容

htroot/AAA /index.php?data= XYZ

,你就能获得价值XYZ在index.php文件与$_GET['data']

+0

如果htaccess在根目录中,则url的htroot部分将被删除。如果htaccess在htroot里面(像Harri描述的那样),你需要从代码中去掉'htroot /'。我也认为这段代码创建了一个无限循环。 – Gerben 2012-03-06 20:57:57

+0

啊,我错过了循环。对不起!如果文件/目录不存在,则添加重写conds以仅执行重写规则。使用'RewriteCond%{REQUEST_FILENAME}!index \ .php $'将是另一种可能性。 – Fabian 2012-03-06 21:05:41

+0

现在看起来没问题。 +1 – Gerben 2012-03-06 21:33:04

1

好的,有些东西我不明白它的工作方式,我想我还有很多要了解mod_rewrite。

但是像这样的htroot/.htaccess文件,它的工作原理:

RewriteEngine On 
RewriteRule ^aaa/(.*)$ aaa/index.php?$1 [L,QSA] 
RewriteRule ^bbb/(.*)$ bbb/index.php?$1 [L,QSA] 
RewriteRule ^ccc/(.*)$ ccc/index.php?$1 [L,QSA] 

您将能够访问$ _GET [ 'XYZ']或任何你把后/在你的index.php脚本。您还将在$ _GET数组中获得奖励'index_php'条目,但我想这是内部重定向的工作方式。

+0

作品在一定程度上,而不是动态恐怕。我可以有几个或一百个aaa/bbb/ccc/ddd等文件夹,因此需要始终与文件夹保持同步。 – 2012-03-09 18:54:21

1

这应该作为一个通用的规则集:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.php 
RewriteRule ^(.*)/(.*) /htroot/$1/index.php?parameters=$2 [L,QSA] 
+0

与上述相同的想法。工作得很好! – 2012-03-09 18:52:47