htaccess如何支持' /'有或没有

时间:2014-12-09 15:26:39

标签: apache .htaccess mod-rewrite redirect

RewriteRule ^([^\/]*)/$ user.php?name=$1 [L,NC]
RewriteRule ^([^\/]*)/([^\/]*)/$ user.php?name=$1&a=$2 [L,NC]
RewriteRule ^([^\/]*)/([^\/]*)/([^\/]*)/$ user.php?name=$1&a=$2&id=$3 [L,NC]

我的网站可能是3个网址格式。

1. http://www.domain.com/user.php?name=tom
   http://www.domain.com/user.php?name=mary
   etc....

2. http://www.domain.com/user.php?name=tom&a=v
   http://www.domain.com/user.php?name=tom&a=photo
   etc....

3. http://www.domain.com/user.php?name=tom&a=v&id=9889
   http://www.domain.com/user.php?name=tom&a=photo&id=123
   http://www.domain.com/user.php?name=tom&a=data&id=123

基本上,只有三个值 我想将url改为301 url重写为domain.com/a/b/c/

这些htaccess代码没问题。但并不完美。

test1:

不行 http://www.domain.com/tom至 - > http://www.domain.com/user.php?name=tom

工作 http://www.domain.com/tom / to - > http://www.domain.com/user.php?name=tom

test2:

不行 http://www.domain.com/mary/v至 - > http://www.domain.com/user.php?name=mary&a=v

工作 http://www.domain.com/mary/v / to - > http://www.domain.com/user.php?name=mary&a=v

test3

不行 http://www.domain.com/kate/photo/123至 - > http://www.domain.com/user.php?name=kate&a=photo&id=123

工作 http://www.domain.com/kate/photo/123 / to - > http://www.domain.com/user.php?name=kate&a=photo&id=123

我希望用户输入的网址更加用户友好或更自由

所以,如何让他们工作?用户可以输入“/”,也可以输入

http://www.domain.com/tom

http://www.domain.com/mary/v

http://www.domain.com/kate/photo/123

任何人都可以给我一些建议吗?还是更聪明的代码?

更多一个网址重写问题...如果没有'/'自动添加'/',htaccess可以设置这些链接?

2 个答案:

答案 0 :(得分:1)

问号量词?匹配出现零或一。这基本上是'用户可以输入'/'或不是'

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^([^\/]+)/?$ user.php?name=$1 [L,NC]
RewriteRule ^([^\/]+)/([^\/]+)/?$ user.php?name=$1&a=$2 [L,NC]
RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/?$ user.php?name=$1&a=$2&id=$3 [L,NC]

注意:这不是SEO友好,因为您提供了两个相同内容的网址。

如果您在键入正斜杠时不希望用户出错,则应将其重定向到非正斜杠网址,而不是将其提供给该网址上的内容。

修改

  

但如果用户不使用'/'来我的网站。我可以使用htaccess发送它们来使用'/'吗?

这将用户从非尾随斜杠网址重定向到带有斜杠的网址

# add trailing slash, when not present
RewriteCond %{REQUEST_URI} !(/$)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

# notice the ? is gone
RewriteRule ^([^\/]+)/$ user.php?name=$1 [L,NC]
RewriteRule ^([^\/]+)/([^\/]+)/$ user.php?name=$1&a=$2 [L,NC]
RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/$ user.php?name=$1&a=$2&id=$3 [L,NC]

这是我的头脑,所以试一试,让我知道它是否有效

答案 1 :(得分:1)

使用:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^([^\/]+)$ $1/ [R=301,L]
RewriteRule ^([^\/]+/[^\/]+)$ $1/ [R=301,L]
RewriteRule ^([^\/]+/[^\/]+/[^\/]+)$ $1/ [R=301,L]

RewriteRule ^([^\/]+)/?$ /user.php?name=$1 [L]
RewriteRule ^([^\/]+)/([^\/]+)/?$ /user.php?name=$1&a=$2 [L]
RewriteRule ^([^\/]+)/([^\/]+)/([^\/]+)/?$ /user.php?name=$1&a=$2&id=$3 [L]

/

之前加user