无法在 .htaccess 中正确重写和重定向 url
Can't rewrite and redirect a url properly in .htaccess
我正在尝试使我网站中的 url(s) 对用户友好,但服务器似乎根本没有考虑 .htaccess 重写命令。
该项目位于 localhost
中,名为 ecommerce
。
我想 "convert" 这个 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= [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]
确保在新浏览器中测试它以避免旧浏览器缓存。
我正在尝试使我网站中的 url(s) 对用户友好,但服务器似乎根本没有考虑 .htaccess 重写命令。
该项目位于 localhost
中,名为 ecommerce
。
我想 "convert" 这个 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= [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]
确保在新浏览器中测试它以避免旧浏览器缓存。