如果文件名减去ext,则覆盖.htaccess url重写行为。与网址相同

问题描述 投票:3回答:2

我正在尝试整理URL并从中删除.php扩展名等。我在网站的基本文件夹中,因此没有父优先或任何内容的.htaccess文件。这是我的htaccess代码。

RewriteEngine On
RewriteRule    ^give/?$    give.php    [NC,L]

这部分没有给出任何实际问题,因为无论什么行为都被覆盖,它的行为方式都是一样的。但是,当我添加其他行时,它将考虑url变量,

RewriteRule    ^give/([0-9]+)/?$    give.php?step=$1    [NC,L]

它完全忽略了它。但是,如果我将give.php重命名为其他任何东西,那么它与url不匹配,它可以工作。例如,使用given.php会使其注意.htaccess规则。我以前从未遇到过这个问题。是否有一些服务器设置我可以更改所以我不必给我的文件奇怪的名字?

另请注意,我尝试将第一行更改为重定向到另一个文件,但不更改实际文件名give.php。它忽略了我的重定向并仍然加载了give.php文件。

编辑:我已经尝试更改2个规则的顺序,我已经尝试评论两个规则,然后另一个查看它们是否相互冲突。我能想到的最好的,服务器有某种默认行为,如果没有/ give /存在目录,则指向/给/ /give.php。因为即使我删除了这两个规则,转到/ give /仍然会将我重定向到/give.php。只有当我将文件名更改为given.php时才会破坏该默认行为。我也尝试将更简单的规则设置为:

RewriteRule    ^give/?$    resources.php    [NC,L]

只要文件give.php存在,它仍然会重定向到give.php。如果我删除了give.php或更改了它的名字,那么转到/ give会重定向到resources.php

php apache .htaccess mod-rewrite
2个回答
2
投票

您可能与MultiViewsmod_negotiation选项有冲突。你的要求可能根本没有击中RewriteRule,而是由于give.php而被mod_negotiation处理。来自the docs

...如果服务器收到/some/dir/foo的请求,如果/some/dir启用了MultiViews,并且/some/dir/foo不存在,那么服务器将读取名为foo。*的文件的目录,并有效地伪造一个命名所有这些文件的类型映射,如果客户端通过名称要求其中一个媒体类型和内容编码,则为它们分配相同的媒体类型和内容编码。然后,它会根据客户的要求选择最佳匹配。

尝试将此添加到您的.htaccess,看看是否有变化:

Options -MultiViews

0
投票

所以有些变化,首先我会在规则之前尝试一些文件条件。其次,你写的params只用于数字,最后QSA用于更多查询。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^give/(.+)$ give.php?step=$1 [QSA, L]
© www.soinside.com 2019 - 2024. All rights reserved.