0

前言

我正在尝试为个人资料页面重写 URL。我所有的应用程序页面都有一个.html扩展名,所以我试图只匹配字母、数字、-. 和..

所以这些是有效的

site.com/steve
site.com/steve-robbins
site.com/steve.robbins

但这些不会

site.com/steve.html
site.com/steve-robbins.php

假设我有一个检查,以便自定义 URL 没有.html.php最后没有。

问题

我目前正在使用它,但它不起作用

RewriteRule ^([a-zA-Z0-9\.-]+)$ profile.php?url=$1 [L]

它应该设置urlsteve,但它设置为profile.php

我究竟做错了什么?


我的完整.htaccess

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]

#
#   LOGIN
#
RewriteRule ^([a-z0-9]{255})/activate\.html$ login.php?activate=$1 [L]
RewriteRule ^logout\.html$ login.php?logout [L]

#
#   SETTINGS
#
RewriteRule ^change-([a-z]+)\.html$ account-settings.php?$1 [L]

RewriteRule ^([a-zA-Z0-9\.-]+)$ profile.php?url=$1 [L]

# SEO friendly URLs
RewriteRule ^([a-zA-Z0-9-_.]+)\.html$ $1.php [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([a-zA-Z0-9-_.]+)\.php
RewriteRule ^([a-zA-Z0-9-_.]+)\.php$ $1.html [R=301]
4

3 回答 3

1

将此添加到规则的顶部(在RewriteBase /指令下):

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

那应该阻止它循环。重写引擎将继续重新应用所有规则,直到进入的 URI(无查询字符串)与来自规则的 URI 相同。这就是为什么 的url值为profile.php

于 2012-09-18T20:46:08.627 回答
0

尝试像这样在重定向中添加前导斜杠:

RewriteRule ^([a-zA-Z0-9.-]+)$ /profile.php?url=$1 [L]

您获得url值的原因profile.php是因为该[L]标志在涉及.htaccess文件时有点误导。在服务器配置文件中,它完全按照您的想法执行,但在.htaccess文件中它停止读取该规则的规则,但随后再次通过规则,直到任何规则未更改路径。通过添加前导,当您从正则表达式中/排除时,您的规则将不会第二次匹配。/我自己花了一段时间在这个功能上苦苦挣扎。

于 2012-09-18T20:40:09.633 回答
0

我是解释 mod_rewrite 规则的初学者,但如果我理解正确,您的规则匹配并再次匹配,要么向 /profile/user 之类的 url 匹配方案添加一些内容,要么添加一个条件以在已重定向的情况下不重定向

于 2012-09-18T20:44:08.300 回答