将博客链接转换为.htaccess中的php文件的正确正则表达式是什么?

qybjjes1  于 2023-06-06  发布在  PHP
关注(0)|答案(1)|浏览(209)

我有一个基于PHP的网站,我试图适应处理SEO友好的博客,故事等网址。我正在尝试让.htaccess工作,以便它可以转换:

example.com/blog/b-this-is-a-post

致:

example.com/blog.php?id=b-this-is-a-post

404页面错误,使用以下.htaccess规则。在我创建.htaccess规则之前,我得到了500个内部服务器错误。

RewriteEngine On
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^blog/(.*)$ blog.php?id=$1 [NC,QSA]
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

重定向到HTTPS工作正常,但是将博客链接转换为blog.php文件以处理它的regex行不起作用。我做错了什么?

6rqinv9w

6rqinv9w1#

RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^blog/(.*)$ blog.php?id=$1 [NC,QSA]
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

你似乎把两个不同的规则(HTTP到HTTPS * 和你的博客重写)混合在一起,并打破了这两个规则。“重定向到HTTPS”不能“正常”工作,因为它是无条件处理的,并且会创建重定向循环(除非HTTPS请求不处理此.htaccess文件?!).
RewriteCond(条件)只适用于后面的第一个RewriteRule指令。RewriteRule指令和前面的 conditions 一起构成了一个规则。
否则,正则表达式是“OK”的(除了它可能匹配得太多)。
你需要像这样重新排序你的指令:

Options -MultiViews

RewriteEngine On

RewriteCond %{HTTP_HOST} (^|\.)example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

RewriteRule ^blog/(.*)$ blog.php?id=$1 [L,QSA]

除非您服务于多个域,否则您可以删除检查HTTP_HOST的初始 * 条件 *。
MultiViews也需要禁用(可能已经禁用),否则blogblog.php将丢失id URL参数。
我已经删除了 blog 重写中的NC标志。理想情况下,正则表达式应该更具限制性,只匹配有效的id * 值 *,而不是 * 所有 *。special characters will result in an error这个规则。
一旦完全测试,HTTP到HTTPS的重定向应该是301(永久)重定向,而不是像您目前所做的302(临时)重定向。

相关问题