从htaccess中的任何目录或子目录重定向到特定页面

时间:2017-03-17 14:39:26

标签: apache .htaccess redirect mod-rewrite

是否可以使用通用规则从.htaccess的任何目录或子目录重定向到特定页面?

更准确地说,如果我想将example.com/login这样的网址重定向到example.com/login.php?action=login,我会在.htaccess文件中使用以下行:

RewriteRule ^login$ /login.php?action=login [L]

但是否有可能让我从example.com/any_directory/login重定向到example.com/login.php?action=login的规则?所以从example.com子目录到``example.com/login.php?action = login`。如果是,我该怎么做呢

2 个答案:

答案 0 :(得分:1)

您需要调整正则表达式模式。只需删除 ^ ,以便它可以在uri之前 login / 之前匹配任何一个,即: / foobar / login

RewriteRule /login/?$ /login.php?action=login [L]

答案 1 :(得分:1)

当然这是可能的。最简单的方法是使用重写条件,因为即使在动态配置文件中,它也会在绝对请求路径上运行。重写规则在相对路径上运行,这使得匹配变得复杂......

看看这个简单的例子:

RewriteEngine on
RewriteCond %{REQUEST_URI} /login$
RewriteRule ^ /login.php?action=login [L]

如果您在http服务器主机配置中进行重写,则可以简化该操作。原因是它始终是规则在该位置工作的绝对路径:

RewriteEngine on
RewriteRule /login$ /login.php?action=login [L]

两种变体的主要方法是依赖登录关键字之前的斜杠。它始终存在于绝对请求路径中,并且明确地左键分隔关键字。并且坚持在行开始时匹配。

一般提示:您应该始终更喜欢将此类规则放在http服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。