.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]

当用户try 转到

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

在调试过程中产生以下错误

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php

因此,我会根据您下面的注释更新.htaccess:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

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

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

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

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

我得到以下错误:

AH00128:文件不存在:/var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

推荐答案

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的形式为/var/www/html/htdocs/activate(因此,由于/var/www/html/htdocs/activate.php存在,文件判断是成功的),但是它将请求重写为activate/foo.php(使用$1反向引用)--activate/foo.php不存在.它将重复执行此操作,每次追加.php(直到达到内部重写限制;默认为10).

Aside#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]

Aside:

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

此规则(外部重定向)应为以上重写的before次.

Php相关问答推荐

为什么注册SIGHUP的处理程序函数会阻止在PHP CLI中等待输入时点击X关闭Xterm窗口?""

编写WooCommerce多步骤签出

在Laravel中,如果我用session—put()存储一些信息,客户端浏览器是否可以使用这些信息?>

使用PHP阅读XML提要

无法在WooCommerce中发送客户笔记邮箱通知

ForHumans函数中的月当量与单位限制

Laravel关系-为用户获取属于组织的所有团队

将购买限制在WooCommerce中具有相同产品属性的项目

Laravel POST方法返回状态:POST方法上不允许使用405方法

在WordPress中从CPT中删除插件

根据WooCommerce Cart小计阈值自动应用优惠券

PHP:为什么递归需要这么长时间

WordPress:今天的计数';修改和发布的帖子

可以';exec、system和shell_exec PHP函数中的命令字符串上的字符数不得超过8175

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

致命错误:未捕获 Google_Exception:客户端机密 JSON 文件无效.在 /somepath/lib/vendor/google/apiclient/src/Google/Client.php

正则表达式将文本替换为标签 html 以字符开头

Shopware 6.4.20店铺激活问题

PHP 合并/合并多维数组

为什么 8.0 之前的 PHP 版本拒绝命名空间Random\Namespace作为无效语法?