使用 GET 参数重写 Apache 不起作用

问题描述 投票:0回答:1

我有一个网址:www.example.com/products.php?category=category 我想重写为 www.example.com/products/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 错误

regex apache url mod-rewrite url-rewriting
1个回答
0
投票

正如@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 在您的服务器上启用了吗?

  • 如何AllowOverride 为此网站设置 (VirtualHost)? 是 文件信息 允许被覆盖吗? 它实际上给了你做的可能性 .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
    
© www.soinside.com 2019 - 2024. All rights reserved.