如何将除现有文件之外的所有请求映射到处理程序

时间:2017-06-27 06:05:26

标签: apache .htaccess handler

需要一些htaccess重写规则的帮助我坚持使用。

我有一个处理程序index.html,用于处理除现有文件之外的所有请求。 我使用这条规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [L]

但我有一些文件名类似来处理请求。如果有一个请求/ main它必须由index.html处理,但由于现有的扩展名文件 - main.asdfjaskldfjaskdfjasfd.js - 我得到404错误处理。

这个问题在nginx中很容易用一个衬垫解决:" try_files $ uri $ uri / /index.html;"但我没有机会在生产中使用nginx - 只有Apache。

所以我需要一些这些规则的帮助。 试过(除了数十个)这个:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^ /index.html

完整的htaccess:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_URI} ^/(demo-auth|api|oauth|password|login|logout|register|images)
RewriteRule ^ laravel.php [L]

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule ^ /index.html

RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

提前致谢。

1 个答案:

答案 0 :(得分:1)

在htaccess的顶部添加,禁用MultiViews:

Options -MultiViews

Apache docs on mod_negotiation描述了多视图选项启用时的功能:

  

如果   服务器接收/ some / dir / foo的请求和/ some / dir / foo没有   存在,然后服务器读取目录查找所有命名的文件   foo。*,并有效地伪造了一个类型地图,列出了所有这些   文件,为它们分配相同的媒体类型和内容编码   如果客户通过名字要求其中一个,那就会有。然后呢   选择最符合客户要求的,并返回   文档。