Php Can';t在.htaccess中正确重写和重定向url
我试图使我的网站中的url对用户友好,但似乎服务器根本不考虑htaccess重写命令 该项目位于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
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]