.htaccess HTACCESS中URL重写的两个参数

.htaccess HTACCESS中URL重写的两个参数,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我正在开发一个简单的五页网站,其中包括一个博客。这是我第一次使用.htaccess正确地重写我的URL以进行SEO友好的优化 我试图允许访问者使用的两个参数是sitename.com/blog/category/WORD或sitename.com/blog/SLUG。如果使用了/category/word,我希望它列出所有带有所选类别词的帖子。如果使用了/slug(一篇文章的简短标题,如“学习如何编码”),我希望它只显示那个特定的文章 这是我的旧。htaccess: RewriteEngine

我正在开发一个简单的五页网站,其中包括一个博客。这是我第一次使用.htaccess正确地重写我的URL以进行SEO友好的优化

我试图允许访问者使用的两个参数是sitename.com/blog/category/WORDsitename.com/blog/SLUG。如果使用了/category/word,我希望它列出所有带有所选类别词的帖子。如果使用了/slug(一篇文章的简短标题,如“学习如何编码”),我希望它只显示那个特定的文章

这是我的旧。htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^blog/([^\.]+)$ blog.php?slug=$1 [NC,L]
RewriteRule ^blog/category/([^\.]+)$ blog.php?category=$1 [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
它最初在单个页面上运行良好,例如sitename.com/aboutsitename.com/contact等等,但每当我尝试sitename.com/blog/SLUG或sitename.com/blog/category/WORD时,它都会重定向到博客页面。我在blog.php中回显$_GET['category']和$_GET['slug']来测试它,但它从未显示任何内容

在看了这里的几篇文章之后,我发现我需要添加一些单独的行来检查正在使用的/blog,并引入适当的参数

这是我当前的.htaccess:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^blog/([^\.]+)$ blog.php?slug=$1 [NC,L]
RewriteRule ^blog/category/([^\.]+)$ blog.php?category=$1 [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
sitename.com/blog/SLUG运行良好,但每当我执行sitename.com/blog/category/WORD时,它都会将“category/WORD”显示为SLUG,而不是将其拆分为category-WORD


我做错什么了吗?有更好的方法吗?

您需要交换^blog行。由于第一个是使用L标志,您实际上是在告诉它停止使用其他规则,因此在您的案例中,它已经将$1作为category/WORD


我不知道后端的其他部分是如何设置的,但您也可以通过索引页查看所有内容的路由。

没有技术的简单解释是为了更好地说明

Line1重写规则^blog/([^\.]+)$blog.php?slug=$1[NC,L]
第2行重写规则^blog/category/([^\.]+)$blog.php?category=$1[NC,L]

在第1行中,您通过url
博客之后的code
([^\.]+)
执行正则表达式检查 在第2行中,您的
url
类别
的硬编码部分,然后执行
正则表达式
检查

因此,在简单的工作中,常规引擎从不转到代码的第2行,因为它已经成为第1行的一部分,并且已经检查并传递了
正则表达式
部分,因此
类别
成为部分


简单提示:始终将硬url部分放在第一位,将
正则表达式部分放在最后。

只需切换行,如
重写规则^blog/category/([^\.]+)$blog.php?category=$1[NC,L]重写规则^blog/([^\.]+)$blog.php?slug=$1[NC,L]