【问题标题】:mod_rewrite redirects don’t work as expectedmod_rewrite 重定向不能按预期工作
【发布时间】:2017-12-22 11:52:56
【问题描述】:

其实我有两个问题:

首先,我尝试将几个短 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>

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

【问题讨论】:

  • login.php 在哪里?如果您可以控制 Apache .conf 文件,那么您不需要 .htaccess
  • @anubhava 在根目录的不同目录下。比如www.site.com/subdir1/login.phpwww.site.com/subdir2/login.php
  • 井规则需要指向一个特定位置。您不能将一个文件保存在多个地方,并希望它会被自己找到。
  • 问题是,^/login?$ ^login.php?action=login&amp;next=$1 规则可以正常工作。这是另一个没有的——^/reset?$ ^login.php?action=reset&amp;next=$1 [L]
  • 是的,我知道它为什么有效。由于MultiViews,它正在写入login.php,但如果您检查$_GET 中的login.php 内容,那么您可能无法获得查询参数。

标签: php apache .htaccess redirect mod-rewrite


【解决方案1】:

只是从我上面的 cmets 开始。将这些规则放在您的站点根目录 .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)由运行之前 mod_rewriteApache's content negotiation module 使用,并使Apache 服务器匹配文件的扩展名。因此,如果 /file 是 URL,那么 Apache 将提供 /file.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多