使用.htaccess 重定向到动态相对路径?
Posted
技术标签:
【中文标题】使用.htaccess 重定向到动态相对路径?【英文标题】:Redirect to dynamic relative paths with .htaccess? 【发布时间】:2012-03-24 08:50:18 【问题描述】:是否可以让 .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
部分在文件系统中没有作为“物理”文件夹或文件存在。
我需要实现的是:当你使用 url 访问时
http://domain.com/htroot/aaa/xyz
它从
获取内容http://domain.com/htroot/aaa/ (or http://domain.com/htroot/aaa/index.php, either way)
index.php 的作用 -> 我可以从 REQUEST_URI 中获取 xyz
并对其进行处理以提供它指定的正确内容,而页面的 URL 自然保持为 http://domain.com/htroot/aaa/xyz
。
到目前为止,如果每个子级别(aaa 等)都有自己的 .htaccess,我已经设法解决了这个问题,但我需要一个在 htroot
中只有一个 .htaccess 来处理这个问题的。我猜这可能与 .htaccess 中的 $0 参数有关,但不确定。
【问题讨论】:
【参考方案1】:您可能想要执行以下操作:
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/(.*)$ /htroot/$1/index.php?data=$2 [L]
如果第一个通配符匹配(.*)
是aaa
,第二个通配符匹配(.*)
是xyz
(htroot/aaa/xyz) 它将从
htroot/aaa/index.php?data=xyz
您将能够使用$_GET['data']
【讨论】:
如果 htaccess 在 root 中,则 url 的 htroot 部分将被删除。如果 htaccess 在 htroot 中(如 Harri 所述),您需要从代码中删除htroot/
。我也认为这段代码创建了一个无限循环。
啊,我错过了循环。对不起!如果文件/目录不存在,则添加了重写条件以仅执行重写规则。使用RewriteCond %REQUEST_FILENAME !index\.php$
是另一种可能性。
光荣。正是我正在寻找的东西并按预期工作,非常感谢!【参考方案2】:
好的,我不明白它的工作方式,我想我还有很多东西要学习 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”条目,但我猜这是内部重定向的工作方式。
【讨论】:
在某种程度上有效,但恐怕不是动态的。我可能有几个或一百个 aaa/bbb/ccc/ddd 等文件夹,因此需要始终与文件夹保持同步。【参考方案3】:这应该作为一个通用规则集:
RewriteEngine On
RewriteCond %REQUEST_URI !\.php
RewriteRule ^(.*)/(.*) /htroot/$1/index.php?parameters=$2 [L,QSA]
【讨论】:
与上面的想法相同。效果也很好!以上是关于使用.htaccess 重定向到动态相对路径?的主要内容,如果未能解决你的问题,请参考以下文章
使用 .htaccess 将路径字符串作为 GET 变量重定向到主页