我有一个自定义404错误重定向页面,通过htaccess可以正常工作。但是,在向htaccess添加新代码后,它停止了工作。导致冲突的原因是什么?如何解决?
编辑:我已经尝试将ErrorDocument行放在页面顶部但它仍然无法正常工作。
htaccess代码:
RewriteEngine On
#Removes www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule . http://%1%{REQUEST_URI} [R=301,L]
#Redirects to extensionless php urls
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^&\ ]+).php
RewriteRule .* /%1? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ $1.php [L]
#Redirect nonexistent files to a 404 page (not working)
ErrorDocument 404 /404.html
答案 0 :(得分:2)
问题不在于将ErrorDocument
放在htaccess的顶部或底部。
由于您的规则(重写为php
扩展名),您有一个无限循环
您需要在重写之前检查它是否存在,否则您的规则与ErrorDocument
之间会出现循环冲突。
您可以用这个替换当前代码
RewriteEngine On
#Remove www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
#Hide php extension (only for existing files)
RewriteCond %{THE_REQUEST} \s/(.+)\.php(?:\s|\?) [NC]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ /%1? [R=301,L]
#Redirect to extensionless php urls (only if it exists)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /$1.php [L]
#Redirect nonexistent files to a 404 page
ErrorDocument 404 /404.html
答案 1 :(得分:0)
将errorDocument语句放在文件的顶部。在RewriteEngine声明之上。
这是解决方案,但是我不能告诉你为什么上面的htaccess代码会导致失败。