代码之家  ›  专栏  ›  技术社区  ›  Basj

当替换字符串不是文件路径而是应该由下一个规则处理的URL时,重写规则

  •  0
  • Basj  · 技术社区  · 4 年前

    我想要每一个请求

    example.com/foo/anything
    

    改写成 example.com/foo-anything 在被Wordpress处理之前。

    我试过这个:

    RewriteEngine On
    RewriteRule ^foo/(.*)   foo-$1       # <-- does not work because the subs. string should be a *file path*
    
    # The following is set by Wordpress
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    

    但它不起作用,因为替换(目标)字符串应该是一个文件路径,而不是另一个URL。

    如何创建这样一个重写规则,替换字符串不是一个文件路径,而是一个URL,应该由下一个规则处理?

    笔记:

    • 具有 RewriteRule ^foo/(.*) foo-$1 [R] ,但它会导致浏览器重定向和 浏览器的URL栏中的URL会发生更改 ,这是我不想要的。

    • 我试过了 RewriteRule flag [PT] 即使替换字符串不是文件路径,但它对我不起作用:它不会重定向 /foo/anything 翻页 /foo-anything .

    • 我试过了

         RewriteRule ^foo/(.*)   index.php?name=foo-$1  [L]
      

      但它只适用于文章,而不适用于 .我想要一个既适用于网页又适用于文章的解决方案。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Basj    4 年前

    经过一些研究,这似乎是不可能的。

    要么是一个带有[R]重定向标志的重写规则,然后浏览器将执行一个新请求,在这种情况下,目标/替换可以是任何新的URL。。。

    ... 或者是 重定向重写规则,然后目标/替换必须是服务于请求的文件。

    另见 How to use RewriteRule such that $_SERVER['REQUEST_URI'] is modified too for PHP?


    在Wordpress上下文中,(工作)黑客是 使用。htaccess重写规则,但在中执行此操作 functions.php :

    $_SERVER['REQUEST_URI'] = preg_replace(..., ..., $_SERVER['REQUEST_URI'])