mod_rewrite重定向无法按预期工作

时间:2017-12-22 11:52:57

标签: php apache .htaccess redirect mod-rewrite

我实际上有两个问题:

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

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>

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

1 个答案:

答案 0 :(得分:1)

仅从我上面的评论中延伸出来。将这些规则放在您的网站根目录.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 modulemod_rewrite之前运行使用,并使Apache服务器匹配文件扩展名。因此,如果/file是网址,那么Apache将提供/file.html