我有一个网址: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 错误
正如@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