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

时间:2017-12-19 21:36:17

标签: php apache .htaccess mod-rewrite

我正在尝试整理网址并从中删除.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

2 个答案:

答案 0 :(得分:2)

您可能与MultiViews的{​​{1}}选项存在冲突。 您的请求可能根本没有达到mod_negotiation,而是由RewriteRulegive.php处理。来自orElseGet

  

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

尝试将此添加到/some/dir/foo并查看是否有变化:

.htaccess

答案 1 :(得分:0)

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^give/(.+)$ give.php?step=$1 [QSA, L]