htaccess ErrorDocument 在删除 php 扩展名时无法使用

htaccess ErrorDocument not working with when removing php extension

.htaccess

# Security Headers
<IfModule mod_headers.c>
    Header set X-XSS-Protection "1; mode=block"
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-Content-Type-Options "nosniff"
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    # Header set Content-Security-Policy ...
    Header set Referrer-Policy "same-origin"
    Header set Feature-Policy "geolocation 'self'; vibrate 'none'"
</IfModule>

# Index.php default 
RewriteEngine On
DirectoryIndex index.php

# Remove .php extension
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC,L]

# Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Error document handling
ErrorDocument 404 https://landon.pw/404
ErrorDocument 403 https://landon.pw/404

Options -Indexes

如果我尝试 landon.pw/a/,它将重定向到 404。 如果我尝试 landon。pw/a,它不会。

我认为问题出在我删除 php 扩展名的方式上。当他们转到 /a 时,它正在尝试服务 a.php,我想这就是为什么它不会将文件重定向到 404。我只是不知道如何规避这个问题。

问题出在您的 # Remove .php extension 中,因为它正在将任何 non-file 请求重写为等效的 .php 文件,而不检查是否存在 .php 文件。

您可以尝试使用此代码使其正常工作:

# Error document handling
ErrorDocument 404 https://landon.pw/404
ErrorDocument 403 https://landon.pw/404

Options -Indexes
# Index.php default 
DirectoryIndex index.php

RewriteEngine On

# Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

# Remove .php extension
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ .php [L]

确保在测试此更改之前清除浏览器缓存。