我的.htaccess 中出现以下代码:
Options +FollowSymlinks
RewriteBase /temp/test/
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^about/(.*)/$ $1.php [L]
RewriteRule ^(.*)/download/(.*)/(.*)/(.*)/downloadfile/$ file-download.php?product=$1&version=$2&os=$3&method=$4 [L]
RewriteRule ^(.*)/download/(.*)/(.*)/(.*)/$ download-donate.php?product=$1&version=$2&os=$3&method=$4 [L]
RewriteRule ^(.*)/download/(.*)/$ download.php?product=$1&version=$2 [L]
RewriteRule ^subscribe/(.*)/$ subscribe-$1.php [L]
RewriteRule ^subscribe/(.*)/(.*)/$ subscribe-$1.php?email=$2 [L]
RewriteRule ^(.*)/screenshots/$ screenshots.php?product=$1 [L]
RewriteRule ^(.*)/(.*)/$ products.php?product=$1&page=$2 [L]
RewriteRule ^schedule-manager/$ products.php?product=schedule-manager&page=view [L]
RewriteRule ^visual-command-line/$ products.php?product=visual-command-line&page=view [L]
RewriteRule ^windows-hider/$ products.php?product=windows-hider&page=view [L]
RewriteRule ^(.*)/$ $1.php [L]
一切都很完美。我想知道如何修改它,让它少一些行数。我很确定我至少可以删除 4-5 行,但我不知道怎么做。(合并 schedule-manager、visual-command-line 和 windows-hider,等等)。
我知道规则的顺序很重要,这个顺序是有效的——虽然我不知道为什么,我只是按照规则玩,直到它起作用。如果你认为以下顺序会有错误,请告诉我在哪里。
另一件事 - 我想将例如 www.myweb.com/products.php 重定向到 www.myweb.com/products/(我的意思是地址栏中的 URL 将会改变)。
我不知道重定向是否可以符合我的重写规则。
谢谢。
编辑:删除了产品的 RewriteRule(Orbling 提到的)并更改了 1 条规则
答案1
顺序很重要,因为您需要确保与细节相匹配的规则先于一般规则,而一般规则也会捕获细节,但不应该这样做。
因此,例如以下双参数行:
RewriteRule ^newsletter-confirm/(.*)/$ newsletter-confirm.php?email=$1 [L]
RewriteRule ^newsletter-remove/(.*)/$ newsletter-remove.php?email=$1 [L]
RewriteRule ^(.*)/screenshots/$ screenshots.php?product=$1 [L]
需要放在通用双精度参数之前:
RewriteRule ^(.*)/(.*)/$ products.php?product=$1&page=$2 [L]
否则,它们将匹配为产品(带页面)请求。只要您在订购时考虑到该优先级,它应该可以正常工作。
您可以重构规则以使其更简洁,但可能以牺牲可读性为代价。唯一多余的规则是最后一条,因为倒数第二行捕获了它。
RewriteRule ^(.*)/$ $1.php [L]
RewriteRule ^products/$ products.php [L]
products/
是泛型 的一个特例(.*)/
,因此在处理最后一条规则之前,泛型 会匹配。幸运的是,它仍然有效,因为关键字幸运地与文件名相同。