我在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中添加什么来处理这种情况?另外,有没有办法简化我现有的两条规则?
答案 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]