请大家,我试图阻止直接访问我的应用程序中的所有文件和页面,并确保没有人能够确定该网站的特定语言。
所以,我想要一种调用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]
但对于前者,我不知道从哪里开始。
答案 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];