Php .htaccess具有扩展名的多个重写规则

Php .htaccess具有扩展名的多个重写规则,php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,所以,我对Apache配置或.htaccess重写规则不是很在行。。。。我正在尝试对本地主机服务器的工作方式进行一些修改 我试图做的是在任何扩展名为“.php”的请求上返回404错误。如果uri没有扩展名,则将请求路由到“ini.php”。如果uri包含一个不属于“.php”的扩展名,那么它应该按照正常的过程获取文件 我现在所拥有的: Rewrite Engine on DirectorySlash off RewriteCond $1 (.php) RewriteRule ^(.*)$ - [

所以,我对Apache配置或.htaccess重写规则不是很在行。。。。我正在尝试对本地主机服务器的工作方式进行一些修改

我试图做的是在任何扩展名为“.php”的请求上返回404错误。如果uri没有扩展名,则将请求路由到“ini.php”。如果uri包含一个不属于“.php”的扩展名,那么它应该按照正常的过程获取文件

我现在所拥有的:

Rewrite Engine on
DirectorySlash off
RewriteCond $1 (.php)
RewriteRule ^(.*)$ - [L,NC,R=404]
RewriteCond $1 !^(.+)
RewriteRule ^(.*)$ ini.php [L,NC]
我的逻辑是,如果它不是.php,并且没有扩展名,那么将其路由到ini.php。否则它应该正常路由

现在看来.php规则正在返回404错误。。但是,如果收到一个没有扩展名的路径请求,它会尝试路由到ini.php并点击404页面。是不是像第二条规则那样处理,然后点击第一条规则

不管怎样,有人能帮我整理一下,给我一些指导吗?我尝试了谷歌和一系列不同的解决方案,但我找不到适合这种情况的解决方案

更新: 我将代码更改为以下内容,并将ini.php添加到httpd中的DirectoryIndex设置中:

RewriteEngine on
RewriteCond %{REQUEST_URI} (\.[php^\\/]+)$
RewriteRule ^(.*)$ - [L,NC,R=404]
RewriteCond %{REQUEST_URI} !(\.[^\\/]+)$
RewriteRule ^.+$ / [L,NC]
你能检查一下它看起来是否合适吗

我又打开了DirectorySlash。谢谢。

这样就可以了:

RewrieEngine on
# 404 any URL ending .php (ignoring any query string)
RewriteRule ^(.+)\.php$ - [R=404,L,NC]
# Rewrite any URL that does not contain a dot (.), and therefore has no extension, to ini.php
RewriteRule ^([^.]*)$ ini.php [END]
根据你所说的,我假设它将被放入
.htaccess
文件中。它需要更改才能进入主配置


不要关机。这样做会带来安全风险(请参阅链接),而且它只适用于现有目录,因此不会给您带来任何问题。
重写引擎中没有空格

谢谢您的回复。我其实不想透露我在处理php文件,所以我想继续用404来回答,尽管我真的很喜欢你的想法。。。这其实有点可笑,因为你在我找到解决办法的时候回答了。。。你能帮我看一下你的想法吗?谢谢你的回复。我其实不想透露我在处理php文件,所以我想继续用404来回答,尽管我真的很喜欢你的想法。。。这其实有点可笑,因为你在我找到解决办法的时候回答了。。。你能看一下,看看你对我有什么看法吗?目录上的RewriteEngine删除RewriteCond%{REQUEST\u URI}(\.[php^\\/]+)$RewriteRule^(.*)-[L,NC,R=404]RewriteCond%{REQUEST\u URI}!(\.[^\\/]+)$RewriteRule^.+$/[L,NC]对于DirectorySlash,如果我关闭索引,是否仍然存在安全问题?没有理由关闭DirectorySlash,为什么要这样做?我很难在这样的评论中读到其余的内容,你能把它发布在问题的更新中吗?可能最简单的就是我将我的答案更新为404,我现在就这么做。是的,你必须有一些其他指令,导致整个URL处理阶段再次运行,所以END标志确保它不会在返回时重新处理与该规则的成功匹配。我不是100%清楚处理阶段再次运行的可能原因,需要了解更多。很高兴它对你有用。很抱歉。更改最后一行上星星的加号应该可以排序。我更新了答案。