我希望用户只能访问domain.com或domain.com/。之后的任何内容,甚至是domain.com/index.php,都应该重定向到domain.com。
我有这个.htaccess
RewriteBase /
RewriteEngine On
Options -Indexes
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} =on
RewriteRule ^$ index.php [L]
RewriteCond %{HTTPS} =on
RewriteRule ^([^/]+)$ 404.php?cp=$1 [L,QSA]
问题是参数永远不为空。因此,404.php总是被调用。如果我去domain.com,它会重定向到404.php?cp=index.php
。如果我删除index.php规则,它会重定向到404.php?cp=index.php
。如果我删除index.php文件和规则,我会得到一个服务器错误。如果我允许index.php
,那么它可以工作并重定向到index.php,但这不是我想要的。用户不应该能够调用index.php,或任何文件,或在域之后添加任何内容,即使最终调用了index.php。所以基本上我想允许一个内部重定向到index.php,只有当它是由htaccess文件指示的,而不是由用户。我该怎么办?
2条答案
按热度按时间d7v8vwbk1#
所以基本上我想允许一个内部重定向到index.php,只有当它是由htaccess文件指示的,而不是由用户。我该怎么办?
要向
http://example.com
提交index.php
请求,您不需要重写规则,只需像这样使用DirectoryIndex
指令:现在,如果用户在
example.com/
之后输入任何内容,则重写为404.php
,您可以检查基于THE_REQUEST
的条件。THE_REQUEST
变量表示Apache从您的浏览器接收的原始请求,并且在执行其他重写指令后不会被覆盖。此变量的示例值为GET /index.php?id=123 HTTP/1.1
因此,结合所有这些,您的完整建议.htaccess应该如下所示:
但是请记住,最后一条规则也会将对资源(如图像、样式表和js文件)的任何请求重定向到
https://example.com
。ijnw1ujt2#
下面的重定向将把所有不是
/
的请求重定向到/
。domain.com和domain.com/是一回事。