如何在删除斜杠时使用动态生成的 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.com
和example2.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" 字符串,而不是正则表达式。这些字符在这里没有特殊含义。
我一整天都在做这个,尝试了几十种变体,但似乎无法让这个重写工作。
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.com
和example2.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" 字符串,而不是正则表达式。这些字符在这里没有特殊含义。