【问题标题】:Htaccess redirect for single page not working单页的 Htaccess 重定向不起作用
【发布时间】:2020-02-07 17:11:52
【问题描述】:

我的 .htaccess 文件有重定向和重写代码。除了一页,一切都很好。我需要将https://example.com/shopping/ceylon-cinnamon-c-62.htmlhttp://example.com/shopping/index.php?cPath=62 重定向到https://example.com/ceylon-cinnamon-c-2_19.html 我已经尝试了下面NONE OF THESE WORK 下面的四行(一次一个),但重定向永远不会起作用。结果网址为https://example.com/c-62.html。谁能指出问题或如何测试它?

 Options +FollowSymLinks -Indexes
 RewriteEngine On 
 RewriteBase /

 # NONE OF THESE WORK
 Redirect 301 /shopping/ceylon-cinnamon-c-62.html https://example.com/index.php?cPath=2_19
 Redirect 301 /shopping/index.php?cPath=62 https://example.com/index.php?cPath=2_19
 RewriteRule ^(.*?)shopping/ceylon-cinnamon-c-62.html$ https://example.com/index.php?cPath=2_19 [R=301,L,NC] 
 RewriteRule ^(.*?)shopping/index.php?cPath=62$ https://example.com/index.php?cPath=2_19 [R=301,L,NC] 

 # THESE ALL WORK 
 RewriteRule ^shopping/(.*)$ /$1 [R=301,NC,L]

 #redirect index.php to root
 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
 RewriteRule ^index\.php$ https://example.com/ [R=301,L]

 RewriteCond %{SERVER_PORT} 80
 RewriteRule ^(.*)$ https://example.com/$1 [R,L]

 RewriteRule ^(.*)-c-(.*).html$ index.php?cPath=$2&%{QUERY_STRING}

【问题讨论】:

  • 您无法使用RedirectRewriteRule 匹配查询字符串。使用RewriteCond %{QUERY_STRING}

标签: .htaccess mod-rewrite


【解决方案1】:

您的问题有点含糊...您给出的示例规则(“这些都不起作用”)与您在问题中提出的问题几乎没有关系。并且声称的重写尝试结果肯定不是您的尝试所实现的。所以要么你的描述不正确(可能是从记忆中写的?),要么你有其他一些你没有告诉我们的因素(一些应用程序逻辑可能实现了它自己的重定向?)......

无论如何,这里有一些简单的规则来实现您所询问的确切重定向,独立于任何其他内容:

RewriteEngine on

RewriteCond %{QUERY_STRING} (?:^|&)cPath=62(?:&|$)
RewriteRule ^/?shopping/index\.php$ /ceylon-cinnamon-c-2_19.html [R=301]

RewriteRule ^/?shopping/ceylon-cinnamon-c-62\.html$ /ceylon-cinnamon-c-2_19.html [R=301]

最好先从 302 临时重定向开始,稍后再将其更改为 301 永久重定向,前提是您确定一切都已正确设置。这样可以防止在尝试时出现缓存问题...

也就是说:在测试时,请确保您没有查看缓存的结果。测试时始终使用新的匿名浏览器窗口,进行 深度重新加载 ,而不仅仅是重新加载并观察您的浏览器网络控制台以获取您收到的实际响应...

此实现同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

  • 如果我的问题不清楚,我深表歉意。我正在尝试将页面的 url 重定向到新的 url。我使用的例子都是在这个网站上找到的。我试过你的代码(谢谢你),但它也不起作用。它通过显示我提到的失败网址而失败。我不知道关于这件事的其他任何事情。我是否正确理解重定向是在先到先得的基础上处理的,并且任何后续都不会影响它?我应该删除重定向所有购物网址的重定向并添加购物目录并将重定向代码放在那里吗?
  • 对不起,我无法从您的问题中理解更多信息,缺少太多信息。是的,配置文件中的指令是从上到下处理的,所以先到先得,但是该过程可以循环,这取决于当前运行的结果。您需要区分重写和重定向,不清楚您想要什么。我建议您开始阅读您使用的工具的文档:httpd.apache.org/docs/current/mod/mod_rewrite.html 作为开源软件的典型代表,它具有出色的质量并带有很好的示例。
  • 感谢您的帮助。阅读文档并没有帮助,因为它说要做我正在做的事情,或者其他人说要做的事情。但是,只是好奇,我怎样才能让我的问题更清楚?我基本上已经发布了整个 .htaccess 文件。是我添加到文件中的 cmets 还是我提出问题的方式?
  • 您的问题的问题是,您的任何重写尝试都不会导致您声称收到的效果。这就是我最初在我的问题中明确表示的。因此,如果 really 是结果并且您没有查看缓存的结果,那么这里必须有一些其他逻辑介入。我们无能为力。
猜你喜欢
  • 2018-02-15
  • 1970-01-01
  • 2015-03-07
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多