mod_rewrite强制小写网址

Esb*_*ben 0 mod-rewrite seo url-rewriting lowercase

我在网上搜索了我的问题的答案而没有任何运气,所以她说:

我正在重做我的mod_rewrite用于搜索引擎优化目的,我希望所有网址都是小写的,例如:

http://BLAbla.com/
Run Code Online (Sandbox Code Playgroud)

http://bla.com/
Run Code Online (Sandbox Code Playgroud)

目前我的.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&params=$2 [L]
Run Code Online (Sandbox Code Playgroud)

但是当我运行http:// localhost/site /我得到错误500.我只知道基本的reg ex,并且mod_rewrite非常有限,所以我不能在这里查看错误.如果我删除重写地图行,页面不会给出任何错误.我的服务器还是不支持重写映射?

关于.htaccess文件的任何其他评论都非常受欢迎:)

谢谢你的时间.

RoU*_*oUS 5

@Esben

重写主机名有点棘手.您是否可以访问服务器错误日志?因为那可能是一些使用有关500的原因的信息.

为了清楚起见,将参数括在引号中是个好主意:

RewriteMap  lc int:tolower
RewriteCond "%{REQUEST_URI}" "[A-Z]"
RewriteRule "(.*)"           "${lc:$1}" [R=301,L]
Run Code Online (Sandbox Code Playgroud)

[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]
Run Code Online (Sandbox Code Playgroud)

以下是什么尝试?

RewriteRule ([\w]*)/$ http://%{HTTP_HOST}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

效果(尽管有时髦的正则表达式)是'如果REQUEST_URI以' /' 结尾,则将其剥离并重定向.那是你要的吗?请记住,.htaccess文件中的内容有点不同..

还有这个:

RewriteRule ^([^/]+)/([^/]?)$ index.php?worker=$1&params=$2 [L]
Run Code Online (Sandbox Code Playgroud)

看起来你试图说'改变任何'foo/bar"进入"index.php?worker = foo¶ms = 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&params=$2" [PT]
Run Code Online (Sandbox Code Playgroud)

我不确定SKIPon RewriteCond语句与RewriteRules 混合的效果,但是请尝试上面的内容,看看你是否更接近.