【问题标题】:.htaccess Multiple Rewrite Rules with Extensions.htaccess 带有扩展的多个重写规则
【发布时间】:2017-01-01 21:36:57
【问题描述】:

所以,我对 Apache config 或 .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。谢谢。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    这样就可以了:

    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 文件中。它需要更改才能进入主配置。

    不要关闭DirectorySlash。这样做会带来安全风险(请参阅链接),并且无论如何它仅适用于现有目录,因此不会给您带来任何问题。 RewriteEngine中没有空格。

    【讨论】:

    • 感谢您的回复。我实际上并不想透露我正在处理 php 文件,所以我确实想继续并回复 404,尽管我真的很喜欢你的想法......这实际上有点有趣,因为你回复就像我找到一个解决方案...你能看看它,看看你对我的看法吗?
    • 感谢您的回复。我实际上并不想透露我正在处理 php 文件,所以我确实想继续并回复 404,尽管我真的很喜欢你的想法......这实际上有点有趣,因为你回复就像我找到一个解决方案...你能看看它,看看你对我的看法吗? RewriteEngine on DirectorySlash off RewriteCond %{REQUEST_URI} (\.[php^\\/]+)$ RewriteRule ^(.*)$ - [L,NC,R=404] RewriteCond %{REQUEST_URI} !(\.[^ \\/]+)$ RewriteRule ^.+$ / [L,NC] 对于DirectorySlash,如果我关闭索引,它仍然是一个安全问题吗?
    • 没有理由关闭 DirectorySlash,您为什么要这样做?我无法在这样的评论中轻松阅读其余部分,您能否将其发布在问题的更新中?可能最简单的就是我将答案更新为 404,我现在就这样做。
    • 是的,您必须有一些其他指令导致整个 URL 处理阶段再次运行,因此 END 标志确保当它们返回时它不会重新处理与该规则的成功匹配。我不是 100% 清楚处理阶段再次运行的可能原因,需要了解更多信息。很高兴它对你有用。
    • 很抱歉。更改最后一行的星号的加号应该对其进行排序。我更新了答案。
    猜你喜欢
    • 2012-12-24
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2012-03-18
    • 2022-01-02
    • 2015-02-15
    • 2017-11-21
    相关资源
    最近更新 更多