重定向所有扩展名为.php的文件

时间:2011-04-04 22:10:47

标签: apache unix .htaccess mod-rewrite webserver

将此代码放在htaccess文件中以隐藏每个文件的最终php扩展

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

但现在我想重新定向到另一个页面,如果用户尝试完成扩展程序。

我在上面的脚本后尝试了这一行,但我得到了一个500内部错误

RewriteRule \.php$ - [R=404]

谢谢!

3 个答案:

答案 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]