为什么我的 .htaccess 代码不能完美地用于 pretty URL

Why is my .htaccess code not working perfectly for pretty URL

我正在使用以下 .htaccess 代码制作漂亮的 url。

# code to make pretty URLS | we're using this code to achieve /category/slug
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ app/post.php?&category=&slug= [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ app/post.php?category= [L]

当我 print_r($_GET) 我得到以下输出

我的URL参数是http://www.exanple.com/usage-tips

Array ( [category] => usage-tips)

但是这个类别下的帖子太多了,所以我还必须从分页器添加页码。

所以现在我的 URL 参数是 http://www.exanple.com/usage-tips/2

Array ( [category] => productivity [slug] => 2 )

print_r($_GET) 显示一个新参数 slug 我希望该参数为 page 因为基于此我将提取变量并相应地设置分页器。我不知道如何实现它。

此外,还有一个问题。假设我有 29 个帖子,并且在每个页面上,我限制了 6 个帖子。

我目前正在使用这个 URL 参数 www.example.com/?page=2 因为如果我使用这个 www.example.com/2 那么它会考虑将变量 2 归入类别

谁能帮我逻辑一下,我哪里错了?

你的问题是没有给出第二个参数是指页码还是 slug 的信息。没有信息就没有办法告诉你,你不能通过实施重写规则直接做任何事情。

此外,您的捕获计数似乎存在一次性问题,但这可能是对此处发布的示例进行了一些简化的结果,因此我将在此处针对特定示例进行修复,但不会发表更多评论关于那个。您需要根据现实生活中的(可能不同的)情况调整给定的解决方案。

不过,还是有变通办法的。您 可以 将用于该分页的 URL 模式更改为 http://www.example.com/usage-tips/page/2 之类的内容,然后很容易匹配该模式:

RewriteEngine on

# http://www.example.com/usage-tips/page/2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.+)/page/([\d]+)$ app/post.php?&category=&page= [END,QSA]

# http://www.exanple.com/usage-tips/some-usage-tip
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)/([\w-]+)$ app/post.php?category=&slug= [END,QSA]

# http://www.exanple.com/usage-tips
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category= [END,QSA]

或者,也许您可​​以定义给定的任何第二个参数,只要它包含纯数值,都将被视为页码,而其他所有内容都被视为 slug:

RewriteEngine on

# http://www.example.com/usage-tips/2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.+)/([\d]+)$ app/post.php?&category=&page= [END,QSA]

# http://www.exanple.com/usage-tips/some-usage-tip
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)/([\w-]+)$ app/post.php?category=&slug= [END,QSA]

# http://www.exanple.com/usage-tips
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category= [END,QSA]

这些修改后的规则集在 http 服务器主机配置或动态配置文件(“.htaccess”文件)中同样有效。

对此的一般性评论:您应该始终更喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件 (".htaccess")。那些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试并且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则(这是一个明显的安全噩梦)的应用程序的情况下作为最后的选择提供。