.htaccess url重写:有没有更好的方法来写这个?

时间:2014-05-06 16:41:45

标签: php .htaccess mod-rewrite

所以我不是最好的,并且最近一直在研究.htaccess编辑以使我的URL看起来很有吸引力,但我想知道如何重写我的.htaccess代码以便它可以像我一样工作如果有必要,我会喜欢它吗?

我遇到的问题是我无法弄清楚如何为需要三个slu $1$2$3的部分编写代码( id,category和image)。目前,当我的PHP检查&image=是否为空时,我的代码无法正常工作;然而它确实适用于?id=1&category=1

我的网站包含这样的布局:

?id=work --> ?id=work&category=1 --> ?id=work&category=1&image=1
?id=shop --> ?id=shop&category=1 --> ?id=shop&category=1&image=1
?id=play --> ?id=play&category=1 --> ?id=play&category=1&image=1
?id=about
?id=archive --> ?id=archive&image=1

我试图将其展示为:

/work --> /work/1 --> /work/1/1
/shop --> /shop/1 --> /shop/1/1
/play --> /play/1 --> /play/1/1
/about
/archive --> /archive/1

这是我的.htaccess:

Options +FollowSymLinks -MultiViews

RewriteEngine on
RewriteBase /

RewriteRule ^(.*)/(.*)$ index.php?id=$1&category=$2 [L,QSA]
RewriteRule ^work/(.*)/(.*)$ index.php?id=work&category=$2&image=$3 [L,QSA]
RewriteRule ^about$ index.php?id=about [L,QSA]
RewriteRule ^archive$ index.php?id=archive [L,QSA]
RewriteRule ^404$ index.php?id=404 [L,QSA]

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

ErrorDocument 404 http://example.com/404

我确信有更好的方式来写这个;我知道这是非常不可思议的 - 但它正在与所有 &image= slug一起工作。我遇到的一些其他问题是文件夹和文件被重写,我已经使用这段代码来修复:

# Allow any files or directories that exist to be displayed directly
RewriteCond ${REQUEST_URI} ^.+$
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]

哦,我还没有包括?id=archive&image=部分 - 我只是无法解决这个问题。

最后一点,但是我已经使用了这段代码,并且在一定程度上使用了它 - 但遇到了循环问题:

RewriteRule ^(.*)/(.*)/(.*)$ index.php?id=$1&category=$2&image=$3 [L,QSA]

1 个答案:

答案 0 :(得分:0)

如果你让第二组和第三组可选,你似乎只需要一条规则:

RewriteRule ^([\w\d]+)(?:/(\d+)(?:/(\d+))?)?$ index.php?id=$1&category=$2&image=$3 [L,QSA]

请注意:

  • 我使用\w(单词字符)和\d(数字)来限制重写的内容。这似乎就是您所需要的,它也可以避免重写现有文件(您也可以添加条件);
  • 我使用了两个非捕获组(?:...)来解决变量数量问题。