使用.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']

在 index.php 中获取值 xyz

【讨论】:

如果 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 重定向到动态相对路径?的主要内容,如果未能解决你的问题,请参考以下文章

将重定向发送到 JSP 中的相对路径?

servlet重定向到jsp后样式无法正常显示

使用 .htaccess 将路径字符串作为 GET 变量重定向到主页

SEO 和 301 重定向 - 它们可以有相对路径还是必须是绝对路径?

URL 重定向未从正确的相对源加载资源

htaccess - 将所有非 www 流量重定向到 www