使用.htaccess清理URL并提供可能的建议

时间:2011-11-16 22:35:28

标签: php .htaccess url-rewriting

我有以下网址:

http://mywebsite.com/somepage.php?product=343&type=4

我希望用户能够输入:

http://mywebsite.com/somepage?product=343&type=4

该角色应该处理子目录中的页面和不同的文件名(不仅仅是Somepage或子域)。例如:

http://mywebsite.com/subdomain/somepage.php?product=343&type=4

键入以下命令可以访问

http://mywebsite.com/subdomain/somepage?product=343&type=4

我也想知道这样的链接是否更清洁?

3 个答案:

答案 0 :(得分:5)

这将采取任何不指向文件或目录的请求,如果.php文件存在,则附加“.php”。

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

这应该通过仅在目标文件存在时重写请求来解决问题。

答案 1 :(得分:0)

我没有对此进行测试,但它可能有用。

RewriteEngine On
RewriteBase /

RewriteRule ^somepage(.*)$ somepage.php [QSA,L]

答案 2 :(得分:0)

虽然正如@Nathan所示,使用.htaccess正确接受正确的URL重写方式,但您也可以选择在每个目录的基础上使用MultiViews

<Directory /home/www/sitename/htdocs>
Options + MultiViews
</Directory>

来自未知文件扩展名的404上的多视图将开始在文件名中搜索匹配项。也就是说,如果URI是foo,它将查找foo.*;也就是说,它可能会找到foo.giffoo.jpgfoo.html等,并会返回最高质量的选项。

如果您确定可以使用唯一名称提供所有内容(不应该很难),那么请务必使用此内容。然后,只需将所有定位更改为somepage?product=343&type=4而不是somepage.php?product=343&type=4

修改

是的,这样的链接可以更清洁。使用URL重写,您可以将URL重写为:

somepage/product/343/type/4somepage/343/4

这是由适当的(相应的)正则表达式完成的:

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)$ $1.php?$2=$3&$4=$5 [L,QSA]

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)/(.*)/(.*)$ $1.php?product=$2&type=$3 [L,QSA]