分页和htaccess

时间:2012-10-26 01:24:06

标签: php .htaccess pagination

我在htaccess中寻找一些帮助,以便在使用分页功能时更好地处理我的网址。

目前我的htaccess看起来像这样:

RewriteEngine On RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  
基本上,我有两个规则。起初我只有第二个,将所有请求定向到我的索引页面,然后我在那里解析url的一些细节以显示正确的内容。我发现它对于只有一个子目录(例如example.com/bars)但只有两个目录(例如example.com/bars/bar-name)的URL不起作用,所以我在它之前添加了规则。

这对我来说很有用。我的所有网址看起来都很棒,而且alias = bars / bars-name已被完全隐藏,现在看起来像/ bars / bars-name

最近虽然我已经整合了一个分页php功能。此函数创建如下所示的URL:

example.com/bars?alias=bars&info=mysql_table_bars&page=2

基本上,'info'是分页功能查询的表名,'page'是当前页面。一旦我开始使用此功能,似乎“别名”也开始显示在网址中。

我希望我的分页看起来像这些例子:

example.com/bars/page/2
example.com/hotels/page/5
etc...

我需要在htaccess中添加什么来处理这种情况?另外,有没有办法简化我现有的两条规则?

1 个答案:

答案 0 :(得分:1)

关于您的原始规则。您刚刚应用于紧随其后的RewriteRule的条件,因此您需要复制它们:

RewriteEngine On 
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  

对于新的分页内容,首先,从查询字符串中提取数据库表名称真的很糟糕,除非它们已经以某种方式进行了验证(这可能是正在发生的事情)。但即便如此,它仍然是一个信息披露问题。因此,您可以使用这些规则始终删除它们:

# This matches the actual request when there's pagination in the query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/\?]+)\?alias=([^&\ ]+)&info=.*&page=([0-9]+)

# an optional sanity check, does the request URI match the "alias" param?
RewriteCond %1:%2:%3 ^(.*):\1:(.*)$

# redirect the browser to the URL with the table name removed
RewriteRule ^ /%1/page/%2? [L,R=301]

然后,您需要使用查询字符串在内部将规则重写回请求的规则:

# rewrite it back to the query string
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/page/([0-9]+) /$1?alias=$1&info=mysql_table_$1&page=$2 [L]