regex Apache重写,GET参数不起作用

wwwo4jvm  于 2023-10-22  发布在  Apache
关注(0)|答案(1)|浏览(103)

我有一个URL:www.example.com/products.php?category=category我想重写为www.example.com/products/category
(the类别可以是肉类,调味品或吸烟者,这取决于用户希望看到的产品)
我使用了一些重写规则,我已经看到在堆栈溢出和其他来源,但没有运气。
最接近的是页面加载,但是category参数返回null而不是值。
举例来说:

RewriteRule ^products/([^/]+)$ products.php?category=$1 [L,QSA]

将加载页面www.example.com/products/meats,但服务器只从类别查询中接收null。
我也试过这个:

# Check if the request is for /products.php with a category query parameter 
RewriteCond %{REQUEST_URI} ^/products\.php$ 
RewriteCond %{QUERY_STRING} ^category=meats$ 
# If the conditions are met, rewrite to /products/<category> with the query string 
RewriteRule ^products\.php$ /products/%1 [L,QSA]

404错误页面

wlzqhblo

wlzqhblo1#

正如@DontPanic所说,你的第一个 RewriteRule 是正确的。我在我的 Apache 安装上试了一下,它在下面的配置下工作得很好。

.htaccess内容

RewriteEngine On
RewriteBase /

RewriteRule ^products/([^/]+)$ products.php?category=$1 [L,QSA]

顺便说一下,如果你在products之前添加一个可选的前导斜杠,你会得到同样的行为:

RewriteRule ^/?products/([^/]+)$ products.php?category=$1 [L,QSA]

products.php内容

<?php

header('Content-Type: text/plain; charset=utf-8');

print $_SERVER['PHP_SELF'] . "\n";

print '$_GET = ' . var_export($_GET, true) . ";\n";

这是我的浏览器为http://rewrites.local/products/smoky-stuff输出的内容:

/products.php
$_GET = array (
  'category' => 'smoky-stuff',
);

关于404错误的几点建议:

  • 您是否已验证服务器上是否启用了mod_rewrite
  • 如何为该网站(VirtualHost)设置 * 允许值 *?是否允许覆盖 FileInfo?它实际上让你有可能在.htaccess文件中执行 RewriteRules,所以你需要有这样的东西:
<VirtualHost *:80> 
    DocumentRoot "/var/www/rewrites.local"
    ServerName rewrites.local
    <Directory "/var/www/rewrites.local">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

或者至少允许 FileInfo

AllowOverride FileInfo

相关问题