如果页面不存在,我希望排除被调用的规则。在我现有的htaccess中,当用户从根目录访问不存在的页面时,该规则会正常工作。奇怪的是,如果用户试图访问一个不存在的有效页面的子目录,它将不起作用。
我的htaccess:
的当前行为example.com/valid-page/ -> example.com/valid-page/ (good)
example.com/valid-page -> example.com/valid-page/ (good)
example.com/valid-page/valid-page -> example.com/valid-page/valid-page/ (good)
example.com/does-not-exist -> example.com/does-not-exist (good)
example.com/valid-page/does-not-exist -> example.com/valid-page/does-not-exist/ (boo!)
对于上面的错误示例,期望的结果应该是不包含正斜杠:
example.com/valid-page/does-not-exist -> example.com/valid-page/does-not-exist
这里是。htaccess:
# Redirects for errors
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
# Hides directory file listings
Options -Indexes
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# Force slash at end of URL
RewriteCond %{REQUEST_URI} /+[^.]+$
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}s([^.]+).php [NC]
RewriteRule ^ %1 [R,L]
# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)/$ $1.php [NC,L]
# Force slash at end of URL RewriteCond %{REQUEST_URI} /+[^.]+$ RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
您需要更改检查REQUEST_FILENAME
的第二个条件,因为当您请求/valid-page/does-not-exist
时,REQUEST_FILENAME
是.../valid-page
,而不是您期望的.../valid-page/does-not-exist
。
使用REQUEST_URI
(或$1
反向引用)代替REQUEST_FILENAME
并构造绝对文件名。例如:
# Force slash at end of URL
RewriteCond %{REQUEST_URI} /+[^.]+$
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
你需要在测试前清除浏览器缓存,因为错误的301(永久)重定向将被浏览器缓存。测试302(临时)重定向,以避免缓存问题。
现在,当您请求/valid-page/does-not-exist
时,您将检查.../valid-page/does-not-exist.php
是否作为文件存在,而不是以前的.../valid-page.php
。
请参阅我对ServerFault上的以下问题的回答,其中更详细地介绍了REQUEST_FILENAME
实际设置为什么。https://serverfault.com/questions/989333/using - apache -重写规则——在htaccess - -删除- html -造成一个- 500错误