【问题标题】:.htaccess rewrite multiple query string as path.htaccess 将多个查询字符串重写为路径
【发布时间】:2017-06-18 15:08:31
【问题描述】:

我已经搜索过这个问题,但我只遇到了非常具体的问题 似乎很难根据我的特定需求量身定制的答案。

假设我要重写的 URL 是这样的:

http://example.com/longterm/home/test.php?id=1&title=London-fire-burns-down

我想重写它,让它看起来像这样:

http://example.com/longterm/home/1/London-fire-burns-down

添加问题。

在 php 中重写后 $_GET['id'] 是否仍然有效

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Web Applications Stack ExchangeWebmaster Stack ExchangeUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • @jww 这个问题显然是关于应用开发的。 (?) mod_rewrite 的使用(这是这里需要的)是一门编程学科。 WebApps 堆栈仅用于第 3 方 Web 应用程序的使用,我也不知道这对于 Unix 和 Linux 堆栈来说是什么主题?但是,它可能是网站管理员堆栈上的主题 - 与这些类型的问题有重叠。
  • @jww 是的,看到一个和其他几个处理这个论点的人。一般的结论是,这些问题被认为是 SO 的主题。但是,SO、Webmasters 和 SF 在这方面存在一定的重叠。但是在 SF 上花了一些时间后,我会说这个问题在 SF 上是题外话。 URL 重写/.htaccess 问题可能会作为catch-all rewriting quide 的副本无条件关闭(无论该“指南”是否涵盖)。

标签: php apache .htaccess


【解决方案1】:

我想重写它,使它看起来像这样:
http://example.com/longterm/home/London-fire-burns-down

你有点倒退了......你将应用程序中的 URL 更改为 /longterm/home/London-fire-burns-down,然后在 .htaccess 中使用 mod-rewrite 在内部将其重写回 /longterm/home/test.php?id=1&title=London-fire-burns-down(实际 URL /文件系统路径)。

因此,您现在有一个需要重写的 URL,例如 /longterm/home/London-fire-burns-down。在文档根目录中的 .htaccess 文件中尝试以下类似操作:

RewriteEngine On
RewriteRule ^(longterm/home)/([^/.]+)$ /$1/test.php?id=1&title=$2 [L]

[^/.]+ 模式匹配任何不包含斜线或点的“标题”。通过防止点被匹配,我们避免了重写循环(即它不会匹配重写的 URL:/longterm/home/test.php)。

但是,我担心id=1 属性也依赖于标题并且也应该更改?如果是这种情况,那么这些信息也需要以某种方式包含在公共 URL 中。例如。 /longterm/home/1/London-fire-burns-down/longterm/home/1-London-fire-burns-down


更新:要合并您的更新问题中所述的id 属性,请将RewriteRule 更改为:

RewriteRule ^(longterm/home)/(\d+)/([^/.]+)$ /$1/test.php?id=$2&title=$3 [L]

我没有向后查询。请正确阅读查询。

如果“旧”网址已被搜索引擎编入索引,则您可以包含一个 redirect,将旧网址重定向到新(漂亮)网址。 (但请注意,应用程序中的 URL必须已经更改为显示新的(漂亮的)URL。)

下面的 redirect 需要在上述重写之前 进行。例如:

RewriteCond %{QUERY_STRING} ^id=(\d+)&title=([^/.&]+)
RewriteRule ^(longterm/home)/test\.php$ /$1/%1/%2? [R,L]

%1 是对 CondPattern 中第一个捕获组的反向引用(即 id),同样%2 是对第二个组的反向引用(即标题)。

RewriteRule 末尾的?(问号)替换会从重定向请求中删除查询字符串。

请注意,这目前是临时 (302) 重定向。仅当您确定它工作正常时才将其更改为永久 (301) 以避免浏览器缓存问题。

总结

把这些放在一起,我们有类似的东西:

RewriteEngine On

# Canonical redirect (in case the old URLs are indexed)
RewriteCond %{QUERY_STRING} ^id=(\d+)&title=([^/.&]+)
RewriteRule ^(longterm/home)/test\.php$ /$1/%1/%2? [R,L]

# Rewrite "pretty" URL to filesytem URL
RewriteRule ^(longterm/home)/(\d+)/([^/.]+)$ /$1/test.php?id=$2&title=$3 [L]

【讨论】:

  • 我格式化了问题,但您的解决方案不起作用。是的,正如您所说,/longterm/home/1/London-fire-burns-down 是必需的。我不是在追问。请正确阅读查询。
猜你喜欢
  • 2012-10-11
  • 2021-12-10
  • 1970-01-01
  • 2015-01-08
  • 2020-11-03
  • 2011-03-07
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多