如何使用 htaccess 从 url 中删除查询字符串
how to remove query string from url using htaccess
有一次朋友帮我解决了这个问题,我就写了这样的代码。其中 example.com/blog-detail?slug=slugvalue
转到 blog-detail.php
而这个 url example.com/project?slug=test
转到 project.php
.
RewriteEngine ON
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{THE_REQUEST} \s([^?]*)\?slug=(\S+)\s [NC]
RewriteRule ^ %1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ blog-detail.php?slug= [QSA,L]
我认为它只适用于博客详细信息页面,现在我遇到了这个问题url
https://www.example.com/project?slug=test,它把我重定向到 404 页面,你能帮我吗?
用你展示的样品,尝试;请尝试遵循 htaccess 规则文件。请确保在测试您的 URL 之前清除您的浏览器缓存。
我在这里添加了 2 个解决方案,所以请一次只使用第一个规则集或使用第二个规则集。
第一个解决方案: 为每个 php 文件设置了 2 个不同的规则,请尝试遵循以下规则。
RewriteEngine ON
###Rules for blog-detail.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s(blog-detail)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ blog-detail.php?slug= [QSA,L]
###Rules for project.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s(project)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ project.php?slug= [QSA,L]
第二种解决方案: 一种通用解决方案,使用捕获组来同时处理两种 php 文件。
RewriteEngine ON
###Rules for blog-detail.php OR project.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s([^?]*)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/(.*)/?$ /.php?slug= [QSA,L]
注意 1: 请保留您的 php 文件(project.php
和 blog-detail.php
)应与您的 htaccess 规则文件一起保存。
注意 2: 对于 JS/CS rewrite/redirect:
您可能需要使用 base 标记来修复您的 js 和其他相关资源。如果您使用相对路径链接 js 文件,那么该文件显然会得到 404,因为它正在寻找 URL 路径。例如,如果 URL 路径是 /file/ 而不是 file.html 那么您的相关资源将从 /file/ 加载,这不是目录而是重写的 html 文件。要解决此问题,请使您的链接成为绝对链接或使用 base 标记。在您网页的 header 中添加此 <base href="/">
以便您的相关链接可以从正确的位置加载。
有一次朋友帮我解决了这个问题,我就写了这样的代码。其中 example.com/blog-detail?slug=slugvalue
转到 blog-detail.php
而这个 url example.com/project?slug=test
转到 project.php
.
RewriteEngine ON
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{THE_REQUEST} \s([^?]*)\?slug=(\S+)\s [NC]
RewriteRule ^ %1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ blog-detail.php?slug= [QSA,L]
我认为它只适用于博客详细信息页面,现在我遇到了这个问题url https://www.example.com/project?slug=test,它把我重定向到 404 页面,你能帮我吗?
用你展示的样品,尝试;请尝试遵循 htaccess 规则文件。请确保在测试您的 URL 之前清除您的浏览器缓存。
我在这里添加了 2 个解决方案,所以请一次只使用第一个规则集或使用第二个规则集。
第一个解决方案: 为每个 php 文件设置了 2 个不同的规则,请尝试遵循以下规则。
RewriteEngine ON
###Rules for blog-detail.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s(blog-detail)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ blog-detail.php?slug= [QSA,L]
###Rules for project.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s(project)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:[^/]*)/(.*)/?$ project.php?slug= [QSA,L]
第二种解决方案: 一种通用解决方案,使用捕获组来同时处理两种 php 文件。
RewriteEngine ON
###Rules for blog-detail.php OR project.php redirect and rewrite.
##Checking condition and getting matches in variables to be used while redirect in next rule.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{THE_REQUEST} \s([^?]*)\?slug=(\S+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/(.*)/?$ /.php?slug= [QSA,L]
注意 1: 请保留您的 php 文件(project.php
和 blog-detail.php
)应与您的 htaccess 规则文件一起保存。
注意 2: 对于 JS/CS rewrite/redirect:
您可能需要使用 base 标记来修复您的 js 和其他相关资源。如果您使用相对路径链接 js 文件,那么该文件显然会得到 404,因为它正在寻找 URL 路径。例如,如果 URL 路径是 /file/ 而不是 file.html 那么您的相关资源将从 /file/ 加载,这不是目录而是重写的 html 文件。要解决此问题,请使您的链接成为绝对链接或使用 base 标记。在您网页的 header 中添加此 <base href="/">
以便您的相关链接可以从正确的位置加载。