无法在 .htaccess 中正确重写和重定向 url

Can't rewrite and redirect a url properly in .htaccess

我正在尝试使我网站中的 url(s) 对用户友好,但服务器似乎根本没有考虑 .htaccess 重写命令。

该项目位于 localhost 中,名为 ecommerce。 我想 "convert" 这个 url: localhost/ecommerce/product?name=abclocalhost/ecommerce/product/abc.

这是 .htaccess 文件:

RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]

##hide /index
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\index [NC]
RewriteRule ^ %1 [R,L,NC]


##HERE IS THE IMPORTANT PART
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /product\.php\?name=([^&]+)
RewriteRule ^ /product/%2/? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?product/([^/]+)/?$ /product.php?name= [L]

当我访问 localhost/ecommerce/product?name=abc 时,url 保持原样,当我访问 localhost/ecommerce/product/abc 时,我得到 500 Internal Server Error

我以为xampp有问题httpd.conf,所以改了

<Directory />
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<Directory />
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

还是不行!

从 .htaccess 中删除我隐藏 .php 扩展名的部分也没有任何区别。

用里面的这个替换你的代码 /ecommerce/.htaccess:

Options -MultiViews
RewriteEngine On
RewriteBase /ecommerce/

##HERE IS THE IMPORTANT PART
RewriteCond %{THE_REQUEST} /product\.php\?name=([^&\s]+) [NC]
RewriteRule ^ product/%1/? [L,R=301]

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} \s/+(.*?/)?(?:index|(\S+?))\.php[/\s?] [NC]
RewriteRule ^ /%1%2 [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?product/([^/]+)/?$ product.php?name= [L,NC,QSA]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ .php [L]

确保在新浏览器中测试它以避免旧浏览器缓存。