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


.htaccess url rewriting: is there a better way to write this?

所以我不是最好的在这方面,只是最近一直在寻找。htaccess编辑,使我的URL看起来有吸引力,但我想知道我将如何去重写我的。htaccess代码,使它的工作,因为我喜欢它,如果有必要吗?

我遇到的问题是我无法弄清楚如何为我需要三个slugs $1, $2$3 (id,类别和图像)的部分编写代码。目前,当我的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

我相信有更好的方式来写这个;我知道这是超级不稳定的-但它正在与所有 but &image=弹头一起工作。我遇到的其他一些问题是文件夹和文件被重写,其中我使用以下代码来修复:

# 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]

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

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

请注意:

  • 我使用'w(字字符)和'd(数字)来限制重写的内容。这似乎是所有你需要的,它也将避免重写现有的文件(你也可以添加条件);
  • 我使用了两个非捕获组(?:...)来避免混淆变量的数量。