.htaccess 重写规则问题

问题描述 投票:0回答:1

.htaccess 重写规则存在问题。将用户电子邮件中的 URL 传递到浏览器,其中包含用于密码重置的令牌。

当前 .htaccess 规则

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.com [NC]
RewriteRule ^(.*)$ https://DOMIAN.com/$1 [L,R=301]

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

RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC]
RewriteRule ^(.*)\.php$ $1 [R=301,L]

当用户尝试转到 DOMAIN/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6 时

在调试中产生这些错误

域/激活/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php

php apache .htaccess
1个回答
0
投票
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

此规则的问题在于您正在检查一个文件系统路径(即

%{REQUEST_FILENAME}\.php
)并重写到另一个文件系统路径(
$1.php
)。对于对
/activate/foo
的请求,其中
activate
不是文件系统目录,则
REQUEST_FILENAME
的形式为
/abs/file/path/to/activate
(因此文件检查成功,因为
/abs/file/path/to/activate.php
存在),但它将请求重写为
activate/foo.php 
(不存在),它会重复执行此操作,每次都会附加
.php
(“永远”)。

旁白#1: 在检查请求+

.php
是否映射到文件之前,无需检查请求是否映射到目录且未映射到文件。当只需要一项时,这是 3 次(昂贵的)文件系统检查。

Aside#2: 您也不需要反斜杠转义 TestString(第一个参数)中的文字点,因为这是一个“普通”字符串,而不是正则表达式。

需要更正此规则,以便您测试最终要重写的相同文件路径。例如:

# Rewrite extensionless ".php" URLs
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.+) $1.php [L]

然后,您需要一个额外的规则来将请求

/activate/<code>
重写为
/activate.php/<code>
(将
/<code>
作为路径信息传递给您的脚本)。这可以是“硬编码”的。例如:

# Rewrite "/activate/<code>" to "/activate.php/<code>"
RewriteRule ^(activate)/([a-f0-9])$ $1.php/$2 [L]

(我假设

<code>
是一个十六进制序列,在您的示例中似乎就是这种情况。)

或者如果您有类似的要求,请使其更通用。例如。

/<file>/<code>
/<file>.php/<code>
。例如:

# Rewrite "/<file>/<code>" to "/<file>.php/<code>"
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/]+)/([a-f0-9])$ $1.php/$2 [L]

旁白:

RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC]
RewriteRule ^(.*)\.php$ $1 [R=301,L]

此规则(外部重定向)应该在 之前上述重写。

© www.soinside.com 2019 - 2024. All rights reserved.