我有一份 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/