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]
确保在测试此更改之前清除浏览器缓存。
.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]
确保在测试此更改之前清除浏览器缓存。