如何在删除斜杠时使用动态生成的 URL 重定向 301?

How to redirect 301 with dynamically generated URL while removing a slash?

我一整天都在做这个,尝试了几十种变体,但似乎无法让这个重写工作。

RewriteCond %{THE_REQUEST} /pwreset\.php\ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ https\:\/\/www\.example\.com\/support\/pwreset\.php [L]

URL它returns是:

https://www.web-jive.com/support/pwreset.php/?key=cdc3b1aa842785f7345be501a30ddc83

我需要删除的是问号前的 pwrest.php 尾部斜线。我哪里错了?

想法是让下面的第一个 URL,重定向到第二个:

https://example1.com/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

https://example2.com/support/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

编辑

根据怀特先生的建议,我将发布整个 .htaccess 文件。

RewriteEngine On

# Announcements
RewriteRule ^announcements/([0-9]+)/[a-z0-9_-]+\.html$ ./announcements.php?id= [L,NC]
RewriteRule ^announcements$ ./announcements.php [L,NC]

# Downloads
RewriteRule ^downloads/([0-9]+)/([^/]*)$ ./downloads.php?action=displaycat&catid= [L,NC]
RewriteRule ^downloads$ ./downloads.php [L,NC]

# Knowledgebase
RewriteRule ^knowledgebase/([0-9]+)/[a-z0-9_-]+\.html$ ./knowledgebase.php?action=displayarticle&id= [L,NC]
RewriteRule ^knowledgebase/([0-9]+)/([^/]*)$ ./knowledgebase.php?action=displaycat&catid= [L,NC]
RewriteRule ^knowledgebase$ ./knowledgebase.php [L,NC]

#Password reset
RewriteCond %{QUERY_STRING} ^key=[0-9a-f]{32}$
RewriteRule ^pwreset\.php$ https://www.web-jive.com/support%{REQUEST_URI} [R=302,L]

#Redirect to new support URL
RewriteCond %{HTTP_HOST} ^members\.web\-jive\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.members\.web\-jive\.com$
RewriteRule ^/?$ "https\:\/\/www\.web\-jive\.com\/support" [R=301,L]
RewriteCond %{HTTP_HOST} ^members\.web\-jive\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.members\.web\-jive\.com$

您看到的输出(URL-路径上的尾部斜杠)不仅仅是您发布的指令的结果,所以您可能与其他指令有冲突,或者您正在看到缓存响应。

但是,您发布的规则似乎比需要的要复杂得多。

1. https://example1.com/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83
2. https://example2.com/support/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

假设:

  • 您不需要匹配 key 值;只是 URL-路径(即 /pwreset.php
  • example1.comexample2.com指向不同的地方(文件系统不重叠)。

要从 1. 重定向到 2.,请在 example1.com 根目录中的 .htaccess 文件顶部尝试以下操作:

RewriteEngine On

RewriteRule ^pwreset\.php$ https://example2.com/support%{REQUEST_URI} [R=302,L]

任何查询字符串(例如 key=abc...)都将原样传递。

请注意,这是一个 302(临时)重定向。只有当您确认它可以正常工作时,才将其更改为 301(永久)。


如果您需要检查 key= URL 参数是否存在并且设置为 32 十六进制字符串(这似乎是您的示例所代表的内容),请在上述条件之前包含一个条件RewriteRule 检查 QUERY_STRING 服务器变量。例如:

RewriteCond %{QUERY_STRING} ^key=[0-9a-f]{32}$
RewriteRule ^pwreset\.php$ https://example2.com/support%{REQUEST_URI} [R=302,L]

如果请求中存在任何其他 URL 参数,则重定向将失败。


旁白:

RewriteRule ^(.+?)/$ https\:\/\/www\.example\.com\/support\/pwreset\.php [L]

这看起来很像 cPanel。 RewriteRule susbtitution 参数中不需要反斜杠冒号、斜杠和点。这是一个 "ordinary" 字符串,而不是正则表达式。这些字符在这里没有特殊含义。