如何将具有文件扩展名的所有网址重定向到.htaccess

时间:2016-11-16 00:11:57

标签: php apache .htaccess url url-rewriting

请大家,我试图阻止直接访问我的应用程序中的所有文件和页面,并确保没有人能够确定该网站的特定语言。

所以,我想要一种调用myapp.com/path/to/page.php的情况,无论是否存在,都会在内部重定向到myapp.com/page_not_found.php。同样,myapp.com/path/to/anywhere会重定向到myapp.com/index.php。

我已经能够处理后来的使用了 如果请求的路径和文件与物理文件不直接匹配

RewriteCond %{REQUEST_FILENAME} !-f

并且请求的路径和文件与物理文件夹

不直接匹配
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^/]*)(.*)$ index.php?path=$1&sub=$2 [QSA,L]

但对于前者,我不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

将* .php重定向到/page_not_found.php:

RewriteCond %{REQUEST_URI} .*\.(php)
RewriteRule ^(.*)/ /page_not_found.php [R]

如果要重定向其他文件类型,例如说* .asp,请将(php)更改为(php | asp)。

要重定向其他所有内容,请同时添加:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$  index.php [L]

作为注释,您不需要将路径作为get参数传递(即index.php?path = $ 1 ...)。相反,在PHP中,请改为读取$_SERVER['REQUEST_URI']值。这会阻止原始查询字符串搞砸(即您可以正常使用$ _GET)。例如,如果原始请求为myapp.com/path/to/page?id=1,那么$_GET['id']将继续正常工作,$_SERVER['REQUEST_URI']/path/to/page?id=1

请注意,$_SERVER['REQUEST_URI']可以包含查询字符串,因此您希望在?分割以关闭该字符串:

// Grab the path:
$path=$_SERVER['REQUEST_URI'];

// Split at ? to remove the query string if there is one:
$path=explode('?',$path,2);

// Get the first part only:
$path=$path[0];