使用.htaccess清理URL并重写同一查询,而无需“重定向过多”

时间:2019-03-17 01:56:11

标签: .htaccess

用户请求以下URI:

https://example.com/page.php?s=201903071830&e=201904192359&t=sampletitle

我想使用.htaccess在浏览器中重写一个干净的URI:

https://example.com/sampletitle

并且我想将干净的URI back 映射到原始URI。

我尝试了以下.htaccess规则:

RewriteCond %{QUERY_STRING} ^s=201903071830&e=201904192359&t=sampletitle$
RewriteRule (.*) https://example.com/sampletitle? [R,L]
RewriteRule ^sampletitle\/?$ /page.php?s=201903071830&e=201904192359&t=sampletitle [L]

预计[L]标志将停止规则处理,这是我认为会发生的情况:

  1. 用户请求原始(复杂)URI。
  2. .htaccess重定向到/ sampletitle;规则处理结束。
  3. RewriteCond不匹配 ,因此首先跳过RewriteRule
  4. 第二RewriteRule匹配并重写;规则处理结束。

但是,相反,我收到“ ERR_TOO_MANY_REDIRECTS”,大概是因为.htaccess卡在重写匹配循环中。

如何使用.htaccess重定向原始URI的传入请求,然后重写相同的查询字符串?

2 个答案:

答案 0 :(得分:1)

编辑,我看到我最初发布的内容以及您要执行的操作的问题。试试看:

RewriteCond %{QUERY_STRING} ^s=201903071830&e=201904192359&t=sampletitle$
RewriteCond %{REQUEST_URI} !^\/?page.php
RewriteRule (.*) https://example.com/sampletitle? [R,L]
RewriteRule ^sampletitle\/?$ /page.php?s=201903071830&e=201904192359&t=sampletitle [L]

答案 1 :(得分:1)

保持规则不变,然后更改第二行:

RewriteCond %{QUERY_STRING} ^s=201903071830&e=201904192359&t=sampletitle$
RewriteRule !^page\.php https://example.com/sampletitle? [R,L]
RewriteRule ^sampletitle\/?$ /page.php?s=201903071830&e=201904192359&t=sampletitle [L]

发生错误是因为您与QUERY_STRING相匹配,所以URI,原始URI和您内部重写的URI都具有相同的QUERY_STRING但有不同的URI,因此您应该排除在此RewriteRule !^page\.php行中,以page.php开头的URI。