mod_rewrite重定向无法按预期工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mod_rewrite重定向无法按预期工作相关的知识,希望对你有一定的参考价值。

我实际上有两个问题:

首先,我正在尝试将多个短URL重定向到包含更多操作的单个页面,如下所示:

RewriteEngine On
RewriteRule ^/login?$ ^login.php?action=login&next=$1 [L]
RewriteRule ^/reset?$ ^login.php?action=reset&next=$1 [L]

这是在<Directory>里面的.conf文件中编写的。问题是第一个规则被执行,而第二个规则没有执行,我无法理解为什么。

我也尝试过这样写:

RewriteCond %{REQUEST_URI} /login$
RewriteRule ^login.php?action=login&next=$1 [L]

RewriteCond %{REQUEST_URI} /reset$
RewriteRule ^login.php?action=reset&next=$1 [L]

我应该提一下login.php不在根目录中,而是在不同的子目录中。

我做错了什么,我该如何解决?

我的第二个问题是,如果我将.htaccess文件放在根目录中,则.conf文件中的规则不再执行。

在.conf文件中我有这些规则:

<Directory>
    Options Indexes FollowSymLinks ExecCGI Includes MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
    RewriteEngine On
</Directory>

为什么这样,我该如何解决?

答案

只是从我上面的评论中延伸出来。将这些规则放在您的站点根目录.htaccess或httpd.conf文件中:

Options -MultiViews
RewriteEngine On

RewriteRule ^/?login(?:/(.*))?$ subdir1/login.php?action=login&next=$1 [L,NC,QSA]
RewriteRule ^/?reset(?:/(.*))?$ subdir1/login.php?action=reset&next=$1 [L,NC,QSA]

选项MultiViews(参见http://httpd.apache.org/docs/2.4/content-negotiation.html)由Apache's content negotiation module使用,它在mod_rewrite之前运行并使Apache服务器匹配文件扩展名。因此,如果/file是URL,那么Apache将服务/file.html

以上是关于mod_rewrite重定向无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

httpd-vhosts.conf 中的重定向无法在 XAMPP 中按预期工作

Litespeed 服务器上的重定向未按预期工作

htaccess 和 mod_rewrite 用于 IPN 重定向

Paypal 未按预期重定向

仅使用 mod_rewrite 重定向主页

EmberJS嵌套动态路由不会按预期重定向