htaccess 动态网址重定向

时间:2021-04-03 13:43:29

标签: .htaccess mod-rewrite

我有以下网址

https://example.com/expert-profile?id=john-doe&locale=en

我希望它被重定向到

https://example.com/expert/john-doe

我尝试了以下

RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([^&]+)&?(.*)?$
RewriteRule ^expert-profile$ https://example.com/expert/%3?%1%4 [L,R=301]

还有其他几个解决方案,这里没有任何效果。有人可以帮助我朝着正确的方向前进吗?

更新:

这是我当前的 .htaccess 文件

<IfModule mod_rewrite.c>

  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule . /index.html [L]

</IfModule>

Redirect 301 "/en/download-app" "/download-app"

3 个答案:

答案 0 :(得分:3)

请将您的 htaccess 文件保存在您的根目录中,并按以下方式使用。 请先清除浏览器缓存,然后再测试您的网址。

RewriteEngine ON
RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ $1/%1-%2 [R=301,L]


OR 如果您没有规则来处理不存在的文件/目录,请使用以下规则集。请确保使用以上或以下规则一次只设置一个。

RewriteEngine ON
RewriteBase /
RewriteRule ^index\.html$ - [L]

RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ $1/%1-%2 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:expert)/([^-]*)-(.*)$ $1-profile?id=$1&locale=$2 [NC,L]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ /index.html [L]

答案 1 :(得分:2)

如果你想重写它,捕获名称 (.+) 并将其插入目标 $1

RewriteRule ^expert/(.+)$ /expert-profile?id=$1&locale=en [L]

并且不要在这里使用标志 R|redirect,除非你真的想要一个 redirect。---


要从 expert-profile?id=john-doe 重定向到 expert/john-doe,请从查询字符串中捕获 ID (.+?) 并将其插入替换 URL %1

RewriteCond &%{QUERY_STRING}& &id=(.+?)&
RewriteRule ^expert-profile$ /expert/%1 [R,L]

当一切正常时,您可以将 R 替换为 R=301 (permanent redirect)。

不要同时使用这两个规则。如果这样做,将导致无限重定向循环并最终给出“500 内部服务器错误”。


不相关,但从不R=301 测试!

答案 2 :(得分:2)

<块引用>

我有以下网址

https://example.com/expert-profile?id=john-doe&locale=en

我希望它被重定向到

https://example.com/expert/john-doe

您需要在 .htaccess 文件的顶部之前您现有的指令(顺序很重要): >

RewriteCond %{QUERY_STRING} (?:^|&)id=([^&]+)
RewriteRule ^expert-profile$ /expert/%1 [QSD,R=301,L]

这将捕获 id URL 参数(在 %1 反向引用中)的值,而不管它出现在查询字符串的何处,并丢弃所有其他 URL 参数。我假设您不需要特别匹配 locale=en?

请注意,正则表达式子模式 ([^&]+)id value)仅匹配 something,而不匹配 nothing。如果 URL 参数为空(即 id=&locale=en),则不会发生重定向。

QSD 标志是丢弃原始查询字符串所必需的。

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并在测试前清除浏览器缓存。如果确实要永久,则仅使用 301(永久)重定向。

将特定 URL /expert-profile?id=<name>&locale=en 重定向到 /expert/<name>,即。 id 参数位于查询字符串的开头,后跟 locale=en 只有这样您才能(并且应该)在 condition 中更加具体。例如:

RewriteCond %{QUERY_STRING} ^id=([^&]+)&locale=en$
RewriteRule ^expert-profile$ /expert/%1 [QSD,R=301,L]
<块引用>
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([^&]+)&?(.*)?$
RewriteRule ^expert-profile$ https://example.com/expert/%3?%1%4 [L,R=301]

这很接近(前提是您将规则放在文件的顶部),但是,这会尝试保留其他 URL 参数,即。 locale=en 和其他任何内容,以创建另一个查询字符串 - 您没有在您的要求中说明。


旁白:现有的答案是假设你想要在另一个方向内部重写(URL重写)请求,即。从 /expert/john-doe/expert-profile?id=john-doe&locale=en。这可能是由于这种性质的问题如何被臭名昭著地写错了,而这通常是真正的潜在意图。但是,您在此处没有提及这一点,并且 /expert-profile 形式的 URL 不是有效端点 - 因此在该方向“重写”该 URL 没有任何意义。 (?)

相关问题