php htaccess URL中存在空字符串的问题

jm81lzqq  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(111)

我希望用户只能访问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文件指示的,而不是由用户。我该怎么办?

d7v8vwbk

d7v8vwbk1#

所以基本上我想允许一个内部重定向到index.php,只有当它是由htaccess文件指示的,而不是由用户。我该怎么办?
要向http://example.com提交index.php请求,您不需要重写规则,只需像这样使用DirectoryIndex指令:

DirectoryIndex index.php

现在,如果用户在example.com/之后输入任何内容,则重写为404.php,您可以检查基于THE_REQUEST的条件。THE_REQUEST变量表示Apache从您的浏览器接收的原始请求,并且在执行其他重写指令后不会被覆盖。此变量的示例值为GET /index.php?id=123 HTTP/1.1
因此,结合所有这些,您的完整建议.htaccess应该如下所示:

DirectoryIndex index.php
Options -Indexes

RewriteEngine On

# http -> https redirection (note there is no REQUEST_URI)
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST} [L,R=301]

# redirect anything after example.com/ to example.com
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+[^\s?]
RewriteRule ^(?!(index|404)\.php$).+ /404.php?cp=$0 [L,NC,QSA,R=302]

但是请记住,最后一条规则也会将对资源(如图像、样式表和js文件)的任何请求重定向到https://example.com

ijnw1ujt

ijnw1ujt2#

下面的重定向将把所有不是/的请求重定向到/。domain.com和domain.com/是一回事。

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/$ 
RewriteRule . / [R=301,L]

相关问题