我正在向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。没有文件可以匹配,所以我可以放弃这个条件。
答案 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]