我有以下网址:
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
我也想知道这样的链接是否更清洁?
答案 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.gif
,foo.jpg
,foo.html
等,并会返回最高质量的选项。
如果您确定可以使用唯一名称提供所有内容(不应该很难),那么请务必使用此内容。然后,只需将所有定位更改为somepage?product=343&type=4
而不是somepage.php?product=343&type=4
修改强>:
是的,这样的链接可以更清洁。使用URL重写,您可以将URL重写为:
somepage/product/343/type/4
或somepage/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]