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

Posted

技术标签:

【中文标题】无法在 .htaccess 中正确重写和重定向 url【英文标题】:Can't rewrite and redirect a url properly in .htaccess 【发布时间】:2020-01-15 06:56:32 【问题描述】:

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

该项目位于localhost 中,名为ecommerce。 我想“转换”这个网址: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=$1 [L]

当我访问localhost/ecommerce/product?name=abc 时,网址保持原样,当我访问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 扩展名的部分也没有任何区别。

【问题讨论】:

这个.htaccess 是否位于/ecommerce/ 目录中? @anubhava 是的,在localhost/ecommerce/里面 RewriteBase / 更改为RewriteBase /ecommerce @Gulshan 谢谢,但这也行不通。 【参考方案1】:

/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]

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

【讨论】:

在我做了一些“干预”之后,它就像一个魅力!谢谢你。我必须在我的 .PHP 文件中使用 &lt;base href="/ecommerce/"&gt;,这样 CSS 才能成功加载。似乎您只是更改了命令的顺序(当然还有其他一些更改)。你能解释一下为什么排序会产生如此大的不同吗? 我认为最大的问题是您的规则中的目标 URI 中有 RewriteBase //product/...。规则的顺序也很重要,因为先保留特定规则,然后再保留通用规则。

以上是关于无法在 .htaccess 中正确重写和重定向 url的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 重写和重定向 SEO 友好的 URL

htaccess mod_rewrite - 尾部斜线和重定向循环

页面未正确重定向 - HTTPS HTACCESS 重写错误

在 AWS amplify 中重写和重定向

使用 .htaccess 从 URL 中删除“/php/”子目录

htaccess 重定向 301 + 重写冲突