Php Can';t在.htaccess中正确重写和重定向url

Php Can';t在.htaccess中正确重写和重定向url,php,.htaccess,url,mod-rewrite,xampp,Php,.htaccess,Url,Mod Rewrite,Xampp,我试图使我的网站中的url对用户友好,但似乎服务器根本不考虑htaccess重写命令 该项目位于localhost中,名为ecommerce。 我想“转换”这个url:localhost/ecommerce/product?name=abc 到localhost/ecommerce/product/abc 以下是.htaccess文件: RewriteEngine On RewriteBase / ## hide .php extension # To externally redirect

我试图使我的网站中的url对用户友好,但似乎服务器根本不考虑htaccess重写命令

该项目位于
localhost
中,名为
ecommerce
。 我想“转换”这个url:
localhost/ecommerce/product?name=abc
localhost/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=$1 [L]
当我访问
localhost/ecommerce/product?name=abc
时,url保持原样,当我访问
localhost/ecommerce/product/abc
时,我得到
500内部服务器错误

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

<Directory />
    AllowOverride None
    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=$1 [L,NC,QSA]

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

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

这是吗。htaccess位于
/ecommerce/
目录中?@anubhava是的,它位于
localhost/ecommerce/
更改
RewriteBase/
中,使用
RewriteBase/ecommerce
@Gulshan谢谢,但这也不起作用。经过一些“干预”后是的,它就像一个符咒!非常感谢。我必须在.PHP文件中使用
,这样CSS才能成功加载。看起来您刚刚更改了命令的顺序(当然还有其他一些更改)。你能解释一下为什么排序会产生如此大的差异吗?我认为最大的问题是在规则中的目标URI中有
RewriteBase/
/product/..
。规则的顺序也很重要,因为先保留特定规则,然后保留通用规则。
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=$1 [L,NC,QSA]

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