在现有的mod_rewrite规则集中重写下划线到连字符

时间:2016-03-14 16:16:23

标签: apache .htaccess mod-rewrite

我的.htaccess中有这套规则,我想添加额外的规则(或更改现有规则),以便将URL中的所有下划线重写为连字符。

RewriteEngine on

#1--Redirect  "/?load=/foo" to "/foo"--#
RewriteCond %{THE_REQUEST} /\?load=/([^\s&]+) [NC]
RewriteRule ^ /%1? [NE,L,R]
#2--Rewrite "/foo" to "/?load=/foo--#
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/?$ /?load=/$1 [NC,L,QSA]

另外,有没有办法限制连续连字符的数量?在某些网址上重写_-可以获得file---data---backup之类的结果,因为原始网址在两个下划线之间有一个连字符。我可以以某种方式将这些URL变成例如而是file-data-backup

2 个答案:

答案 0 :(得分:0)

您可以使用其他重定向规则:

nextButton.setDisable(true);
task = createWorker();          
progressInd.progressProperty().bind(task.progressProperty());
th = new Thread(task);          
th.start();                     

答案 1 :(得分:0)

所述方法,例如, this answer中的on the Apache httpd wiki here应该适合你。主要是,您需要添加一些RewriteConds,以防止它应用于与图像和其他实际文件相对应的任何URL:

# Replace all but the last underscore with dashes internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*_.*)$ $1-$2 [N]

# Replace the last underscore and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

(在现有规则之前添加这些规则,但在RewriteEngine On行之后。请注意,如果您不知道,可以省略RewriteConds,并且不会在其名称中包含任何带有下划线的实际文件。)

您还可以修改这些规则以折叠连续的连字符:

# Collapse all but one group of multiple hyphens internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*(-[^-]+)*)--+([^-]+(-[^-]+)*--.*)$ $1-$3 [N]

# Collapse the last group of hyphens and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-]*(-[^-]+)*)--+([^-]+(-[^-]+)*|)$ /$1-$3 [L,R=301]

或者甚至同时做两件事:

# Collapse all but one group of multiple hyphens and/or underscores internally:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-_]*(-[^-_]+)*)(--|-_|_)[-_]*([^-_]+(-[^-_]+)*(--|_).*)$ $1-$4 [N]

# Collapse the last group of hyphens and/or underscores and issue a HTTP permanent redirect:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^-_]*(-[^-_]+)*)(--|-_|_)[-_]*([^-_]+(-[^-_]+)*|)$ /$1-$4 [L,R=301]

(免责声明:我实际上没有测试过这些规则。我相信它们应该有效,但我可能在某个地方犯了错字。)

这些规则都不会以任何方式影响查询字符串,这可能是您想要的。如果你想要替换查询字符串中的下划线和/或多个连续连字符,你也可以这样做,例如使用描述的方法Change Location Mode to High Accuracy Programmatically Android