【发布时间】:2020-08-05 16:52:54
【问题描述】:
从 https://serverfault.com/questions/1013461/cant-use-parentheses-in-rewritecond-query-string 移出,因为它是这里的主题。
我需要从旧网址捕获 UID 并将其重定向到新格式。
example.com/?uid=123 应该重定向到example.com/user/123
应该怎么做:
RewriteCond %{QUERY_STRING} ^uid=(\d+)$
RewriteRule ^$ /user/%1? [L]
这根本不重定向。
但是,这样做:
RewriteCond %{QUERY_STRING} ^uid=\d+$
RewriteRule ^$ /user/%1? [L]
它转到example.com/user。 UID 被忽略,但它确实重定向。
注意:我所做的只是删除了第二个示例中的括号。
这是为什么?如何匹配查询并捕获 UID 的值?
更新
这是一个 laravel 应用。我发现我确实看到的重定向可能来自应用程序,而不是 Apache。
很快就会自动回答...
暂时添加 R=302 会得到想要的结果:
RewriteCond %{QUERY_STRING} ^uid=(\d+)$
RewriteRule ^$ /user/%1? [L,R=302]
当然,这会将 302 重定向发送到 /users/123。我想看看这是否可以通过内部重写来完成......
以下是 laravel 默认 .htaccess 中的一些规则:
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
这会捕获不指向真实文件的路径,并将它们指向 laravel 应用程序。当它被删除时,Apache 会以 404 响应 /users/1234。
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l
这样的重写可以追溯到 Apache 的 URL 解析器。然后再次处理 .htaccess(因为它仍然适用于这个新 URL)。在这一点上,我希望上述规则能够拾取不存在的路径并将其指向 laravel 应用程序...
找到了。现在写一个答案。
【问题讨论】:
-
新的一天,我想我刚刚找到了线索。等我弄明白了再贴出来。
-
(FWIW 你的问题可能被认为是网站管理员的更多主题。虽然它仍然是 ServerFault 的主题,......等等。)我实际上是在当您在 SF 上删除问题时的评论中间...
-
"...但它确实" - 肯定有其他事情发生。这里有一些奇怪之处......上面的指令不是“重定向”,而是“内部重写”。如果您看到“重定向”,那么似乎还有其他事情在这样做?
-
但是从
/?uid=123到/user/123的rewrite 没有多大意义——这应该是一个外部重定向(如果有的话)。否则,/user/123如何被路由? (这可能是对/?uid=123的内部重写?尽管严格来说这应该是直接重写处理请求的文件,例如/index.php?uid=123,而不是让 mod_dir 为目录索引发出额外的内部子请求。( ?)) -
你说得对。我必须指定 R=302 来解决它。我正在看到的重定向来自应用程序。重要的缺失信息:这是一个 laravel 应用程序。我会尽快发布答案。 (抱歉删除,顺便说一句)
标签: laravel apache .htaccess mod-rewrite query-string