Apache Rewrite urls - 如果存在.html,则删除.html并返回404

时间:2014-08-15 13:55:46

标签: apache .htaccess mod-rewrite

我正在向Apache 2提供的网站添加一个目录,我想从传入的请求中删除.html扩展名。在/ new-directory中我有一个包含以下内容的.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

因此,使用此规则/ new-directory / page工作,但/ new-directory/page.html也有效,我不想要。我希望新目录/子目录中的所有页面仅在没有 .html的情况下提供页面,如果有page.html请求,则返回404未找到的页面。

这些是新页面,所以我不关心重定向。

修改 忘记提到/ new-directory(/ new-directory / dhandler)中只有一个文件 - 一个Perl脚本,如果有匹配的数据库条目,它会解析传入的url。没有文件可以匹配,所以我可以放弃这个条件。

3 个答案:

答案 0 :(得分:2)

想出来,我的错,我没有解释/ new-directory中只有一个默认文件处理程序会导致一些混乱,请参阅上面的编辑 - 无论如何这都有效:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.html [NC,L]

RewriteCond %{THE_REQUEST} .*\.html[\s\?]{1}
RewriteRule .*\.html$ - [R=404,L]

让我搞砸的是,有时这些网址会有查询字符串,所以我必须检查空间和?匹配%{THE_REQUEST}中的.html。

编辑:如果有人在目录中有实际的.html文件(而不是像我这样动态处理所有请求的文件),那么他们应该添加:

RewriteCond %{REQUEST_FILENAME} -f
在'RewriteEngine On'之后

确保传入请求与/ new-directory中的现有文件匹配。

答案 1 :(得分:0)

您需要执行以下规则:

RewriteBase /
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [NC,L]

RewriteCond %{THE_REQUEST} .*\.html\s
RewriteRule .*\.html$ - [R=404,L]

第一个检查实际上是否存在与请求对应的html文件。如果是,它将在内部重写请求。

第二条规则会将结束.html任何重定向到未找到的404。

答案 2 :(得分:0)

将此代码放在/new-directory/.htaccess

RewriteEngine On
RewriteBase /new-directory/

RewriteCond %{THE_REQUEST} /(?:index)?(.*?)\.html[\s?] [NC]
RewriteRule ^ %1 [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{DOCUMENT_ROOT}/new-directory/$1\.html -f [NC]
RewriteRule ^(.+?)/?$ $1.html [L]