【问题标题】:Force a 404 error when ".php" is present in URL当 URL 中存在“.php”时强制出现 404 错误
【发布时间】:2015-02-22 19:19:22
【问题描述】:

我有这个 隐藏 .php 扩展名的 .htaccess 代码。效果很好。

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php

我现在尝试在 URL 中存在 .php 时产生 404 Not Found 错误,因为我想强制人们使用没有 .php 的 URL。这是我现在拥有的代码:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^$ /home.php [QSA,L]
RewriteRule ^(.+)\.php - [L,R=404]

我是 .htaccess 的新手,但每当我转到 .php 页面时,上面的代码都会导致 404 错误,即使 .php 不在 URL 中也是如此。

我必须进行哪些调整才能使其仅在 .php 位于 URL 中时导致 404 Not Found?

【问题讨论】:

  • .htaccess 样式文件永远不能“隐藏”某些东西。它仅适用于 incoming 请求。这取决于您发送 URL 中可见内容的页面。如果您不发送包含 .php 后缀的 URL,那么问题出在哪里?为什么要阻止其他 URL?只要转发他们,每个人都很高兴!否则你会让用户感到沮丧。

标签: regex .htaccess


【解决方案1】:

重写条件仅适用于紧跟规则,这意味着:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

只适用于

RewriteRule ^$ /home.php [QSA,L]

但不是以下规则:

RewriteRule ^(.+)\.php - [L,R=404]

最后一条规则的问题在于它会检查 URI 中是否包含 .php,它这样做,因为您在第一条规则中添加了 .php 扩展:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php

所以你需要添加另一个条件来防止这种情况发生:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ $1.php

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^$ /home.php [QSA,L]
RewriteCond %{THE_REQUEST} \ /+[^\?\ ]+\.php
RewriteRule ^ - [L,R=404]

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2017-06-06
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多