将此代码放在htaccess文件中以隐藏每个文件的最终php扩展
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
但现在我想重新定向到另一个页面,如果用户尝试完成扩展程序。
我在上面的脚本后尝试了这一行,但我得到了一个500内部错误
RewriteRule \.php$ - [R=404]
谢谢!
答案 0 :(得分:2)
你有这样的重写规则:
RewriteEngine on
Options +FollowSymlinks -MultiViews
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !^myvar=0
RewriteCond %{REQUEST_URI} !\..*$
RewriteRule ^(.*)$ /$1.php?myvar=0 [QSA,L]
# but don't allow example.com/foo.php
RewriteCond %{QUERY_STRING} !^myvar=0$
RewriteRule \.php$ - [R=404,L]
基本上,第一条规则是在URL中附加一个虚拟查询参数myvar=0
,其次是检查它是否存在以启动,因此如果用户键入/abc.php则会被阻止,但如果只是/ abc则它在内部重定向到/abc.php。
答案 1 :(得分:1)
Mod_rewrite仅接受R
标志的值301和302(如果未指定,则为默认值)。如果您希望发送到404,我建议将请求发送到自定义404页面:RewriteRule \.php$ /404.php [L]
,其中404.php将响应状态设置为404.
答案 2 :(得分:0)
Apache Server帮助文档: Apache 2.2于2005年发布 - 10年前。 https://en.wikipedia.org/wiki/Apache_HTTP_Server
Apache 2.2 R标记HTTP响应状态代码帮助信息: https://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_r
可以使用语法指定任何有效的HTTP响应状态代码 [R = 305],如果没有,则默认使用302状态代码 指定。指定的状态代码不一定是a 重定向(3xx)状态代码。但是,如果状态代码在...之外 重定向范围(300-399)然后删除替换字符串 完全,并且重写被停止,就好像使用了L一样。
Apache 2.4 R标记HTTP响应状态代码帮助信息: https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r
可以使用语法指定任何有效的HTTP响应状态代码 [R = 305],如果没有,则默认使用302状态代码 指定。指定的状态代码不一定是a 重定向(3xx)状态代码。但是,如果状态代码在...之外 重定向范围(300-399)然后删除替换字符串 完全,并且重写被停止,就好像使用了L一样。
其他相关信息:
“假设RewriteRule中的目标(或替换字符串) 默认情况下为文件路径。“
“ - (破折号) 短划线表示不应执行替换(现有路径未经过触摸传递)。当需要在不改变路径的情况下应用标志(见下文)时使用。“
简单来说,替换字符串是您正在重写/重定向的http URI路径。这意味着当您使用4xx重定向范围(例如R = 405)时,如果RewriteRule中存在URI目标路径,则将忽略/不允许/不使用URI目标路径。
这个RewriteRule是有效的,适用于大多数情况下/大多数服务器/服务器配置,但可能无法在每个单独的情况下工作,所以如果你想要在100%的所有服务器配置中工作,那么你会愚蠢的代码和不使用R = 405。在实时测试中,R = 405在全球主机的99.99%的情况下起作用。
RewriteCond %{REQUEST_METHOD} ^(HEAD) [NC]
RewriteRule ^(.*)$ - [R=405,L]
愚蠢的代码:
RewriteCond %{REQUEST_METHOD} ^(HEAD) [NC]
RewriteRule ^(.*)$ /path-to-405-error-logging-file/405.php [L]