apache .htaccess重写规则

jgwigjjp  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(91)

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

当用户尝试转到
example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6
在debug中产生这些错误
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]

我得到以下错误:
页面不存在页面不存在.版权所有:深圳市金源科技有限公司粤ICP备16032236号-1

gudnpqoy

gudnpqoy1#

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反向引用)-这并不存在。它将重复执行此操作,每次都追加.php(直到达到内部重写限制;默认值10)。

  • Aside#1:* 在检查请求+.php是否Map到文件之前,不需要检查请求是否未Map到目录和文件。这是3个(昂贵的)文件系统检查,而只需要一个。
  • Aside#2:* 你也不需要对 TestString(第一个参数)中的文字点进行反斜杠转义,因为这是一个“普通”字符串,而不是正则表达式。

这个规则需要修正,这样你就可以测试你最终要重写的文件路径。举例来说:

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

然后,您需要一个额外的规则来将请求/activate/<code>重写为/activate.php/<code>(将/<code>作为path-info传递给脚本)。如果这是一次性的,这可能是“硬编码”的。举例来说:

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

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

相关问题