htaccess 动态 url 重定向
htaccess dynamic url redirect
我有以下URL
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"
请将您的htaccess 文件保存在您的根目录中,并按以下方式保存。
请在测试您的网址之前清除您的浏览器缓存。
RewriteEngine ON
RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ /%1-%2 [R=301,L]
或 如果您没有规则来处理不存在的 files/directories 则使用以下规则集。请确保一次只能使用以上或以下规则集。
RewriteEngine ON
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ /%1-%2 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:expert)/([^-]*)-(.*)$ -profile?id=&locale= [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ /index.html [L]
如果要重写,捕获名称(.+)
并将其插入目标</code></p>
<pre><code>RewriteRule ^expert/(.+)$ /expert-profile?id=&locale=en [L]
并且不要使用标志 R|redirect
here, unless you really want a 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
测试!
I have following URL
https://example.com/expert-profile?id=john-doe&locale=en
I want it to be redirected to
https://example.com/expert/john-doe
您需要在 .htaccess
文件的 top 处执行类似以下操作,before 您现有的指令(顺序很重要):
RewriteCond %{QUERY_STRING} (?:^|&)id=([^&]+)
RewriteRule ^expert-profile$ /expert/%1 [QSD,R=301,L]
这会捕获 id
URL 参数的值(在 %1
反向引用中),无论它出现在查询字符串中的什么位置,并丢弃所有其他 URL参数。我假设您不需要特别匹配 locale=en
?
请注意,正则表达式子模式 ([^&]+)
(id
值)仅匹配 something,而不匹配 没什么。如果 URL 参数为空(即 id=&locale=en
),则不会发生重定向。
QSD
标志是丢弃原始查询字符串所必需的。
首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并在测试前清除浏览器缓存。如果确实打算 永久.
,则仅使用 301(永久)重定向
将特定的 URL /expert-profile?id=<name>&locale=en
重定向到 /expert/<name>
,即。 id
参数位于查询字符串的开头,后面跟着 locale=en
只有这样您才能(并且应该)在 条件 中更加具体。例如:
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 真的没有意义在那个方向。 (?)
我有以下URL
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"
请将您的htaccess 文件保存在您的根目录中,并按以下方式保存。 请在测试您的网址之前清除您的浏览器缓存。
RewriteEngine ON
RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ /%1-%2 [R=301,L]
或 如果您没有规则来处理不存在的 files/directories 则使用以下规则集。请确保一次只能使用以上或以下规则集。
RewriteEngine ON
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{QUERY_STRING} ^id=([^&]*)&locale=(.*)$ [NC]
RewriteRule ^([^-]*)-.*/?$ /%1-%2 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:expert)/([^-]*)-(.*)$ -profile?id=&locale= [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ /index.html [L]
如果要重写,捕获名称(.+)
并将其插入目标</code></p>
<pre><code>RewriteRule ^expert/(.+)$ /expert-profile?id=&locale=en [L]
并且不要使用标志 R|redirect
here, unless you really want a 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
测试!
I have following URL
https://example.com/expert-profile?id=john-doe&locale=en
I want it to be redirected to
https://example.com/expert/john-doe
您需要在 .htaccess
文件的 top 处执行类似以下操作,before 您现有的指令(顺序很重要):
RewriteCond %{QUERY_STRING} (?:^|&)id=([^&]+)
RewriteRule ^expert-profile$ /expert/%1 [QSD,R=301,L]
这会捕获 id
URL 参数的值(在 %1
反向引用中),无论它出现在查询字符串中的什么位置,并丢弃所有其他 URL参数。我假设您不需要特别匹配 locale=en
?
请注意,正则表达式子模式 ([^&]+)
(id
值)仅匹配 something,而不匹配 没什么。如果 URL 参数为空(即 id=&locale=en
),则不会发生重定向。
QSD
标志是丢弃原始查询字符串所必需的。
首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并在测试前清除浏览器缓存。如果确实打算 永久.
,则仅使用 301(永久)重定向将特定的 URL /expert-profile?id=<name>&locale=en
重定向到 /expert/<name>
,即。 id
参数位于查询字符串的开头,后面跟着 locale=en
只有这样您才能(并且应该)在 条件 中更加具体。例如:
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 真的没有意义在那个方向。 (?)