apache - 为什么此 RewriteRule 会更改 QUERY_STRING,但保留 REQUEST_URI 不变?

标签 apache .htaccess mod-rewrite url-rewriting concrete5

我有一份 Concrete5 副本,它是一个基于 PHP 的 CMS,在 example.com 上运行。

Concrete5 附带了以下关于漂亮 URL 的基本说明(将所有 URL 重定向到中央 index.php)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/c5.7
RewriteRule ^.*$ c5.7/$0 [L]    # Concrete5 is running in the c5.7/ subdirectory
</IfModule>

非常简单。

现在我有一组采用以下形式的 URL:

 /product/{productname}

我需要转发到 Concrete5(虚拟)URL

/products/details?name={productname}

当我在浏览器中手动输入该 URL 时,该 URL 已设置并按预期工作。

所以我在 htaccess 文件中添加了一行,它现在看起来像这样:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# New rule for products
RewriteCond %{REQUEST_URI} ^/product/
RewriteRule ^product/(.+)$ /products/details?name=$1 [QSA]

RewriteCond %{REQUEST_URI} !^/c5.7
RewriteRule ^.*$ c5.7/$0 [L]

</IfModule>

我可以确认,当我选择随机的外部 URL 作为重定向目标时,会触发 RewriteRule

但是每当它是像上面这样的内部重定向时,会发生的情况是,我在 Concrete5 中收到 404。当我检查传递给它的内容时,我看到:

 REQUEST_URI:  /product/my-random-product
 QUERY_STRING: name=my-random-product

看来规则已被触发并进行了一些重写,但 REQUEST_URI 保持不变!

为什么?

是因为 PHP 7.1 是通过 CGI 运行的吗?

我尝试了无数种变化,所有的 flags在书中,但收效甚微。

最佳答案

PHP 中的 REQUEST_URI 与 mod_rewrite 中的 REQUEST_URI 不同,因此不能这样做。在 PHP 中,它始终包含原始 URL。因此,如果您的 CMS 正在处理该问题,您就无法像这样更改它。

您应该将 CMS 设置为使用您想要的 URL,而不是像这样尝试增强 CMS 的 URL 重写。

如果您在 PHP 中检查 REDIRECT_URL,您将看到最后重写的 URI。

关于apache - 为什么此 RewriteRule 会更改 QUERY_STRING,但保留 REQUEST_URI 不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44160346/

相关文章:

perl - 客户端浏览器关闭时中断服务器端 perl CGI 脚本

java - 为 servlet 分配异常 - JAVA 中的 Web 编程

apache - 在家进行有趣的网络编程项目的建议

php - Symfony 基本 HTTP 身份验证不起作用

php - 如何强制 wordpress 中的特定页面为非 SSL (http)

php - 删除在 Codeigniter 中无法与我的实时服务器一起使用的 index.php

php - CakePHP URL 重写在 Ubuntu 上不起作用

php - UTF-8贯穿始终

.htaccess - 当原始 url 以确定词结束时,使用 htaccess 重定向到其他域

php - 在 Wordpress 上使用 .htaccess 重写 URL 以实现 SEO 友好