我正在使用以下.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=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ app/post.php?category=$2 [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
视为类别
有人可以在逻辑上帮助我,我哪里出问题了?
答案 0 :(得分:2)
您的问题是,没有给定第二个参数是页码还是段信息的信息。没有信息就无从谈起,您无法通过实施重写规则直接做什么。
您似乎也对捕获计数有一个一次性的问题,但这可能是由于简化了此处发布的示例而导致的,因此我将在此处针对特定示例进行修复,但不对此做更多评论。您将需要根据给定的解决方案适应现实生活中(可能不同)的情况。
但是有解决方法。您可以将用于该分页的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=$1&page=$2 [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=$1&slug=$2 [END,QSA]
# http://www.exanple.com/usage-tips
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category=$1 [END,QSA]
或者,也许您可以定义任何给定的包含纯数字值的第二个参数都将被视为页码,而其他所有参数均被视为无用信息:
RewriteEngine on
# http://www.example.com/usage-tips/2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.+)/([\d]+)$ app/post.php?&category=$1&page=$2 [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=$1&slug=$2 [END,QSA]
# http://www.exanple.com/usage-tips
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category=$1 [END,QSA]
这些修改后的规则集将在http服务器主机配置或动态配置文件(“ .htaccess”文件)中同样起作用。
关于此的一般说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用动态配置文件(“ .htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为,难以调试的原因,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。