我在网上搜索了我的问题的答案而没有任何运气,所以她说:
我正在重做我的mod_rewrite用于搜索引擎优化目的,我希望所有网址都是小写的,例如:
http://BLAbla.com/
变为
http://bla.com/
目前我的.htaccess看起来像这样:
RewriteEngine on
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule (.*)$ http://www.example.com/$1 [R=301,L]
RewriteRule ([\w]*)/$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^([^/]+)/([^/]?)$ index.php?worker=$1¶ms=$2 [L]
但是当我运行http://localhost/site/时,我得到错误500.我只知道基本的reg ex,并且mod_rewrite非常有限,所以我不能在这里查看错误。如果我删除重写地图行,页面不会给出任何错误。我的服务器不支持重写映射吗?
非常欢迎有关.htaccess文件的任何其他评论:)
感谢您的时间。
答案 0 :(得分:5)
@Esben
重写主机名有点棘手。您是否可以访问服务器错误日志?因为有些人可能会使用有关500的原因的信息。
为了清楚起见,最好将参数括在引号中:
RewriteMap lc int:tolower
RewriteCond "%{REQUEST_URI}" "[A-Z]"
RewriteRule "(.*)" "${lc:$1}" [R=301,L]
[L]
将强制此操作结束对此请求的处理,这意味着如果要对URI执行更多工作,则会在重新提交请求时发生。您可能需要考虑对修改进行批处理,以便请求只进行一次修改过程:
RewriteMap lc int:tolower
RewriteCond "%{REQUEST_URI}" "[A-Z]"
RewriteRule "(.*)" "${lc:$1}" [E=REDIRECT:TRUE]
RewriteCond "%{HTTP_HOST}" "!^www\." [NC]
RewriteRule "^" "-" [E=REDIRECT:TRUE,E=PREFIX_WWW:TRUE]
以下是什么尝试?
RewriteRule ([\w]*)/$ http://%{HTTP_HOST}/$1 [R=301,L]
效果(尽管有时髦的正则表达式)是'如果REQUEST_URI以“/
”结尾,请将其删除并重定向。那是你要的吗?请记住,.htaccess
文件中的内容有点不同。
而且:
RewriteRule ^([^/]+)/([^/]?)$ index.php?worker=$1¶ms=$2 [L]
看起来你正试图说'改变任何'foo / bar“进入”index.php?worker = foo& params = bar“'。如果这是正确的,它可能不会起作用。由于您位于.htaccess
文件中,因此您与文件系统路径匹配,不 URI。
所以试试这个:
RewriteMap "lc" "int:tolower"
RewriteCond "%{REQUEST_URI}" "[A-Z]"
RewriteRule "(.*)" "${lc:$1}" [E=REDIRECT:TRUE]
RewriteCond "%{HTTP_HOST}" "!^www\." [NC]
RewriteRule "^" "-" [E=REDIRECT:TRUE,E=PREFIX_WWW:TRUE]
RewriteCond "${ENV:REDIRECT}" "!TRUE"
RewriteRule "^" "-" [SKIP=2]
RewriteCond "${ENV:PREFIX_WWW}" "TRUE"
RewriteRule "(.*)" "http://www.${HTTP_HOST}/$1" [R=301,L]
RewriteRule "^" "-" [R=301,L]
RewriteRule "^([^/]+)/([^/]?)$" "index.php?worker=$1¶ms=$2" [PT]
我不确定SKIP
对RewriteCond
语句与RewriteRule
s混合的影响,但请尝试上述内容,看看你是否更接近。