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

时间:2019-01-11 21:52:01

标签: .htaccess url-redirection

我整天都在工作,尝试了数十种变体,但似乎无法完全重写。

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是:

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=$1 [L,NC]
RewriteRule ^announcements$ ./announcements.php [L,NC]

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

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

1 个答案:

答案 0 :(得分:0)

您看到的输出(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.,请在.htaccess的根目录下的example1.com文件顶部尝试以下操作:

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 参数中反斜杠冒号,斜杠和点。这是一个“普通”字符串,而不是正则表达式。这些字符在这里没有特殊含义。