【问题标题】:How do I create a rewrite rule for URLs with a GET parameter?如何为带有 GET 参数的 URL 创建重写规则?
【发布时间】:2019-02-02 00:27:46
【问题描述】:

我正在尝试重写这种类型的 URL:

http://www.example.com/news/?lang=en

http://www.example.com/en-news

这也应该是递归的,这意味着:

http://www.example.com/news/world/?lang=en

应该改写为:

http://www.example.com/en-news/en-world/

到目前为止,我的 .htaccess 中有这个(用 arkasha 的 answer 修改):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# Rewrite language parameter
RewriteCond %{QUERY_STRING} (^|&)lang=(\w+)
RewriteRule /?(\w+)/?$ %1-$1 [END]
</IfModule>

但这似乎不起作用。

【问题讨论】:

  • RewriteRule ^([^/]+)$ http://www.example.com/%1-$1? [NC,L,R] 应该将/news/?lang=en 重定向到/en-news
  • 为什么要在每个目录组件前加上en-
  • @anubhava 这是一个多语言网站,这就是在 url 中定义语言的方式。
  • 好的,我理解多语言部分,但 URL 可以是 http://www.example.com/en/news/hello/world/ 而不是 http://www.example.com/en-news/en-hello/en-world/

标签: regex .htaccess mod-rewrite url-rewriting


【解决方案1】:

您需要使用重写条件从查询字符串中捕获令牌,然后您可以在重写规则中使用它:

RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)lang=(\w+)
RewriteRule /?(\w+)/?$ %1-$1 [END]

该规则集应该在 http 服务器主机配置或动态配置文件(“.htaccess”样式文件)中同样有效,但是您应该避免使用第一个选项。显然重写模块需要加载到http服务器并在http主机内部启用。如果您决定使用动态配置文件,您还需要确保完全启用它的解释并且它位于正确的位置。

【讨论】:

  • 我只能在 .htaccess 中执行此操作,而且我应该指定这是一个 Wordpress 站点。我包含了代码(请参阅我更新的帖子),但它似乎没有做任何事情。
  • 多条规则从上到下处理。您可能需要在第一个规则之后立即将规则向上移动。
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多