htaccess - RewriteRules 声明导致 404 错误
25-02-10
13
本篇文章给大家谈谈htaccess-RewriteRules声明导致404错误,同时本文还将给你拓展.htaccessmod-rewriteapache混淆导致每天10k404的结果、.htacces
本篇文章给大家谈谈htaccess - RewriteRules 声明导致 404 错误 ,同时本文还将给你拓展.htaccess mod-rewrite apache混淆导致每天10k 404的结果、.htaccess rewrite 规则详细说明、.htaccess Rewrite 规则详解、.htaccess RewriteRule 提供正确的链接,但也提供 404 等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
htaccess - RewriteRules 声明导致 404 错误
如何解决htaccess - RewriteRules 声明导致 404 错误? 不知道为什么我的 .htaccess 文件没有做它应该做的关于 mod_rewrite 的事情。
mod_rewrite 已启用,并且我相信目录路径具有正确的指令。
<Directory /var/www/html/test>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
在 ubuntu 20.04 上运行 apache2
这是我当前的 .htaccess 文件:
RewriteEngine on
RewriteCond %{THE_REQUEST} /test/_plugin/accounts/ [NC]
RewriteRule ^test/_plugin/accounts/(.*)$ /test/accounts/$1 [L,R]
RewriteRule ^test/accounts/(.*)$ /test/_plugin/accounts/$1 [L]
我想在这里完成的是:
保留 /test/_plugin/accounts/
的内容并显示它以将 URL 重写为 /test/accounts/
,其中 /test/accounts/
目录实际上并不存在。
对此的任何帮助将不胜感激
解决方法
我相信我现在已经弄清楚了。我去掉了 Indexes
指令,这似乎使事情奏效了。
<Directory /var/www/html/test>
Options FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>
并稍微修改了 .htaccess:
RewriteCond %{THE_REQUEST} /test/_plugin/accounts/ [NC]
RewriteRule ^_plugin/accounts/(.*)$ /test/accounts/$1 [L,R]
RewriteRule ^accounts/(.*)$ /test/_plugin/accounts/$1 [L]
.htaccess mod-rewrite apache混淆导致每天10k 404的结果 我已经回顾了许多与.htaccess , apache , mod-rewrite和regex ,但我只是没有得到它。 我尝试了一些不同的东西,但是我要么复杂的事情,要么犯了初学者的错误。 不pipe怎么说,我已经过了几天了,每天都有一万四百零四的东西在某处显示出来。
我的网站
我有一个WordPress网站,其中包含超过23000个职位,分为1200多个类别。 该网站的functionstream媒体video文件,行业新闻,显示评论,电影,PHPbb论坛等,结构是这样的:
所有stream媒体节目的网站/基本类别(0和az)/子类别(系列名称)/post(节目名称.html)
所有stream媒体电影的site / movies / post title.html
网站/新闻/ posttitle.html
网站/评论/ posttitle.html
网站/ page.html分类的网页
网站/论坛
固定链接结构是/%category%/%postname%.html
带锚链接的mod_rewrite
如何在不发送404头的情况下redirect未find的URL?
https非www到https www
使用.htaccess将所有非www都redirect到www和http
符号链接和索引文件无法正常工作的.htaccessconfiguration
我使用的是Yoast wordpress SEO插件,并且可以select为目录和类别添加尾部斜线。
这里是当前的.htaccess
# BEGIN wordpress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.PHP$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.PHP [L] </IfModule> # END wordpress
我的例子
从我们旧的网站结构中,我们有许多使用“/ episode title /”的入站链接。 这是错误的。 我们需要这些传入链接redirect到/手表动漫/字母,数字或符号只有1个字符长/系列标题/集title.html
/one-piece-episode-528/
应该
/watch-anime/o/one-piece/one-piece-episode-528.html
我做的一个错误导致了这个问题…“ /watch-anime/letter/series title/episode title/ ”to“ /watch-anime/letter/series title/episode title.html ”。 所以,我们需要删除单个post的尾部斜杠并添加.html
/watch-anime/w/welcome-to-the-nhk/welcome-to-the-nhk-episode-14/
应该
/watch-anime/w/welcome-to-the-nhk/welcome-to-the-nhk-episode-14.html
当与旧的网站结构问题结合时,同样的错误导致了这个问题…“ /episode title.html ”需要是“ /watch-anime/letter/series title/episode title.html ”
/one-piece-episode-528.html
需要是
/watch-anime/o/one-piece/one-piece-episode-528.html
正如您所看到的,我在迁移网站post结构和尝试修复网站之间做了一些混乱的事情。 我现在要求您提供任何帮助,以获得一个适当的.htaccess文件,将照顾这些301redirect。
感谢您提供的任何帮助!
使用.htaccess禁用所有CGI(PHP,perl,…)目录
根据apache envvariables,有条件地要求HTTPauthentication
移动PDF文件的htaccess规则?
configurationhtaccess以绕过直接链接到CSS和Javascript文件
.htaccess重写规则强制将httpsredirect到http
我不知道如果RewriteMap使用.htaccess文件,但无论如何这里是我的虚拟主机的解决方案,应该完美地工作。
创建一个RewriteMap文件。 在这里看到更多的信息 。 这是一个非常简单的文本文件:首先,错误的URL 没有“/” ,然后一个空间 (至少),然后正确的URL,像这样:
one-piece-episode-528 /watch-anime/o/one-piece/one-piece-episode-528.html dexter-season-6-episode-1 /watch-interesting-stuff/d/dexter/dexter-season-6-episode-1.html breaking-bad-full-season-3 /watch-interesting-stuff/b/breaking-bad/breaking-bad-full-season-3.html
等等。
将这个简单的文本文件转换成哈希映射。 例如:
httxt2dbm -i mapanime.txt -o mapanime.map
现在在你的虚拟主机中声明:
RewriteMap mapanime dbm:/pathtofile/mapanime.map
所以你的虚拟主机应该看起来像:
<VirtualHost *> RewriteEngine On RewriteMap mapanime dbm:/pathtofile/mapanime.map # don't touch the URL,but try to search if it exists in mapanime RewriteRule /([^/]*)/$ - [QSA,NC,E=VaraNIME:${mapanime:$1|notfound}] # if VaraNIME not empty *and* # VaraNIME different from "notfound": RewriteCond %{ENV:VaraNIME} ^(notfound|)$ # then redirect it to the right URL: # QSA = query string append # R = redirect,301 = definitive redirect # L = last = don't go further RewriteRule . %{ENV:VaraNIME} [QSA,R=301,L] </VirtualHost>
希望这可以帮助。
我没有看到一个更简单的解决方案,但我很确定这一个将工作。
如果它不工作:阅读我通常的“两个提示”,并添加重写日志在你的问题。
两个提示:
请尝试使用RewriteLog指令:它可以帮助你追踪这样的问题:
# Trace: # (!) file gets big quickly,remove in prod environments: RewriteLog "/web/logs/mywebsite.rewrite.log" RewriteLogLevel 9 RewriteEngine On
我最喜欢的工具来检查正则表达式:
http://www.quanetic.com/Regex (不要忘了选择ereg(POSIX)而不是preg(PCRE)!)
.htaccess rewrite 规则详细说明 国内的虚拟机一般不提供.htaccess功能(据我所知,discuz的主机好像提供此功能),而在国外主机中,.htaccess功能似乎是标配,笔者的Blog架在MT上,支持.htaccess,每次看到一堆别人写好了的.htaccess设置,很多命令都不甚了了,查看、修改起来很不方便,痛定思痛,潜心学习一下,知其所以然嘛~
学习前提:(不会的朋友要学习一下,才能更好的理解下面的文字呢)
Linux基础(不会也没事啦,写个.htaccess没必要大费周折啦,推荐:鸟哥私房菜linux基础)
正则表达式(Rewrite规则建立在正则的基础之上,推荐:正则表达式30分钟入门教程)
rewrite的语法格式:
复制代码 代码如下:
RewriteEngine On #要想rewrite起作用,必须要写上哦
RewriteBase url-path #设定基准目录,例如希望对根目录下的文件rewrtie,就是”/”
RewriteCond test-string condPattern #写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。
RewriteRule Pattern Substitution #规则
RewriteEngine On|Off
RewriteEngine 用于开启或停用rewrite功能。
rewrite configurations 不会自动继承,因此你得给每个你想用 rewrite功能的虚拟主机目录中加上这个指令。
RewriteBase URL-path
RewriteBase用于设定重写的基准URL。在下文中,你可以看见RewriteRule可以用于目录级的配置文件中 (.htaccess)并在局部范围内起作用,即规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自动地附着回去。默认值 是”RewriteBase physical-directory-path”。
在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。通常,此前缀就是 对应的文件路径。但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定! 所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。
如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定 RewriteRule 。
RewriteCond TestString CondPattern [flags]
RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。
TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
RewriteRule反向引用: 引用方法是 $N (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
RewriteCond反向引用: 引用方法是 %N (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
RewriteMap 扩展: 引用方法是 ${mapname:key|default}
服务器变量: 引用方法是 %{ NAME_OF_VARIABLE } 这个是我们最常使用到的功能
NAME_OF_VARIABLE具体数值见下表:
HTTP headers:
connection & request:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
server internals:
system stuff:
specials:
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
这些都对应于类似命名的HTTP MIME头、Apache服务器的C变量以及Unix系统中的 struct tm字段,大多数都在其他的手册或者CGI规范中有所讲述。 而其中为mod_rewrite所特有的变量有:
IS_SUBREQ
如果正在处理的请求是一个子请求,它包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,有可能会产生子请求。
API_VERSION
这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。此模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。
THE_REQUEST
这是由浏览器发送给服务器的完整的HTTP请求行。(比如, “GET /index.html HTTP/1.1″). 它不包含任何浏览器发送的附加头信息。
REQUEST_URI
这是在HTTP请求行中所请求的资源。(比如上述例子中的”/index.html”.)
REQUEST_FILENAME
这是与请求相匹配的完整的本地文件系统的文件路径名或描述.
CondPattern是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.
注意:CondPattern是一个兼容perl的正则表达式, 但是还有若干补充:
可以在pattern串中使用''!‘ 字符(惊叹号)来实现匹配的反转。
RewriteOptions Options
RewriteOptions指令为当前服务器级和目录级的配置设置一些选项。 Option可以是下列值之一:
inherit
此值强制当前配置可以继承其父配置。 在虚拟主机级配置中,它意味着主服务器的映射表、条件和规则可以被继承。 在目录级配置中,它意味着其父目录的.htaccess中的条件和规则可以被继承。
MaxRedirects=number
为了避免目录级RewriteRule的无休止的内部重定向, 在此类重定向和500内部服务器错误次数达到一个最大值的时候, mod_rewrite会停止对此请求的处理。 如果你确实需要对每个请求允许大于10次的内部重定向,可以增大这个值。
RewriteRule Pattern Substitution [flags]
RewriteRule指令是重写引擎的根本。此指令可以多次使用。 每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要, 因为,在运行时刻,规则是按这个顺序逐一生效的.
Pattern是一个作用于当前URL的兼容perl的正则表达式。
此外,还可以使用否字符(‘!‘)的pattern前缀,以实现pattern的反转。但是,需要注意的是使用否字符以反转pattern时,pattern中不能使用分组的通配成分;即$N。
重写规则中的Substitution是, 当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。除了纯文本,还可以使用
$N 反向引用RewriteRule的pattern
%N 反向引用最后匹配的RewriteCond pattern
规则条件测试字符串中(%{VARNAME})的服务器变量
映射函数调用(${mapname:key|default})
下面给出几个完整的例子供各位参考:
一、防盗链功能
只这四行就实现了防盗链是不是很神奇^_^,编写起来是不是又觉得复杂。
复制代码 代码如下:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
二、网址规范化
这个是把所有二级域名都重定向到www.yourdomain.com的例子,现在看来是不是很简单了?
复制代码 代码如下:
Options +FollowSymLinks
rewriteEngine on
rewriteCond %{http_host} ^yourdomain.com [NC]
rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
三、临时错误页面
当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。
复制代码 代码如下:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /error.html [R=302,L]
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours
附录:flags
‘redirect|R [=code]‘ (强制重定向 redirect)
以http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。 注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。 通常,你会希望停止重写操作而立即重定向,则还需要使用''L''标记.
‘forbidden|F'' (强制URL为被禁止的 forbidden)
强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。
‘gone|G'' (强制URL为已废弃的 gone)
强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.
‘proxy|P'' (强制为代理 proxy)
此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。 使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。 注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能; 如果没有,则必须启用mod_proxy并重新编译“httpd”程序。
‘last|L'' (最后一个规则 last)
立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(‘/'')为实际存在的URL, 比如, ‘/e/www/''.
‘next|N'' (重新执行 next round)
重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。 但是要小心,不要制造死循环!
‘chain|C'' (与下一个规则相链接 chained)
此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。
‘type|T=MIME-type'' (强制MIME类型 type)
强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”.
‘nosubreq|NS'' (仅用于不对内部子请求进行处理 no internal sub-request)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。 比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用, 它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。 根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。
‘nocase|NC'' (忽略大小写 no case)
它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,''A-Z'' 和''a-z''没有区别。
‘qsappend|QSA'' (追加请求串 query string append)
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
‘noescape|NE'' (在输出中不对URI作转义 no URI escaping)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如''%'', ‘$'', ‘;''等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如: RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
可以使''/foo/zed''转向到一个安全的请求''/bar?arg=P1=zed''.
‘passthrough|PT'' (移交给下一个处理器 pass through)
此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc为/def, 然后通过mod_alias使/def转变为/ghi,可以这样: RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/…为filename=/def/…, 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。
注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。混合使用mod_alias和mod_rewrite就是个典型的例子。
For Apache hackers
如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。
''skip|S=num'' (跳过后继的规则 skip)
此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和''chain|C''标记是不同的!)
‘env|E=VAR:VAL'' (设置环境变量 environment variable)
此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via or CGI (如 $ENV{‘VAR''})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]'' (设置cookie)
它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如''.apache.org'', 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。
深入阅读:http://oss.org.cn/man/newsoft/ApacheManual/mod/mod_rewrite.html
您可能感兴趣的文章: 使用.htaccess设置图片防盗链的详细方法 Apache使用 .htaccess 来实现强制https访问的方法 让Apache 2支持.htaccess并实现目录加密的方法 APACHE支持.htaccess伪静重写出错 No input file specified的解决方案 Apache使用.htaccess 屏蔽恶意 User Agent(防蜘蛛) PHP中的.htaccess伪静态文件 禁止网站显示文件目录列表的2个方法(htaccess) Apache服务器中.htaccess文件的实用配置示例集锦 使Nginx服务器支持.htaccess的方法 Apache服务器中.htaccess的基本配置总结 Apache服务器中使用.htaccess实现伪静态URL的方法 Ubuntu下开启Apache对.htaccess 的支持 Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess nginx支持.htaccess文件实现伪静态的方法分享 apache使用.htaccess文件实现屏蔽wget下载网站内容 21个常用的apache .htaccess文件配置技巧分享 教你如何在CI框架中使用 .htaccess 隐藏url中index.php 利用.Htaccess阻止IP恶意攻击网站,禁止指定域名访问,禁止机器爬虫,禁止盗链
.htaccess Rewrite 规则详解
在弄wordPress的固定链接时遇到 问题,总是404,最后经过百度、Google,终于找到了问题所在,原来是httpd.conf中的
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
红字部分改成 ALL 就行了,拿出来给大家分享下,另外转载此博客分享。
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
2、举例说明:
下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.colorme.com和203.81.23.202都跳转到主机前缀为http://www.colorme.com.cn,避免当用户在地址栏写入http://colorme.com.cn时不能以会员方式登录网站。
NameVirtualHost 192.168.100.8:80
ServerAdmin webmaster@colorme.com.cn
DocumentRoot "/web/webapp"
ServerName www.colorme.com.cn
ServerName colorme.com.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.colorme.com.cn [NC] #声明Client请求的主机中前缀不是www.colorme.com.cn,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写
RewriteRule ^/(.*) http://www.colorme.com.cn/ [L]
# 含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.colorme.com.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。
例二.将输入 folio.test.com 的域名时跳转到profile.test.com
listen 8080
NameVirtualHost 10.122.89.106:8080
ServerAdmin webmaster@colorme.com.cn
DocumentRoot "/usr/local/www/apache22/data1/"
ServerName profile.test.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^folio.test.com [NC]
RewriteRule ^/(.*) http://profile.test.com/ [L]
3.Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量
4.Apache rewrite例子集合
在 httpd 中将一个域名转发到另一个域名虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://www.webhosting-world.com/forums/-f60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。
在中添加下面的重定向规则:
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
添加了上面的规则以后, 里的全部内容如下:
ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
ServerName www.webhosting-world.com
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.com
RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]
# Redirect webhosting-world.com to wbhw.com
RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]
URL重定向
例子一:
1.http://www.zzz.com/xxx.php-> http://www.zzz.com/xxx/
2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user\.php$
RewriteCond %{REQUEST_URI} \.php$
RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^\.]+)\.zzz\.com http://www.zzz.com/user.php?username=$1
例子二:
/type.php?typeid=* --> /type*.html
/type.php?typeid=*&page=* --> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
5.使用Apache的URL Rewrite配置多用户虚拟服务器
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的这台Linux Server上。
然后,看一下我的Apache中关于*.semcase.com的虚拟主机的设定。
#*.com,*.osall.net
ServerAdmin webmaster@semcase.com
DocumentRoot /home/www/www.semcase.com
ServerName dns.semcase.com
ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net
CustomLog /var/log/httpd/osa/access_log.log" common
ErrorLog /var/log/httpd/osa/error_log.log"
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$
/home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
在这段设定中,我把*.semcase.net和*.semcase.com 的Document Root都设定到了 /home/www/www.semcase.com
但是,继续看下去,看到...配置了吗?在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.semcase.com 或者 xxxx.semcase.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www /dev.semcase.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。
.htaccess RewriteRule 提供正确的链接,但也提供 404 根据您展示的样品,您可以尝试以下操作吗?公平的警告我已经在移动设备上写了这个,所以还没有测试它应该可以工作恕我直言也会在某个时候测试它。此外,由于您提到可能有多个域,所以我特意在此处添加了一个条件来检查它是否是 example.nl,以防您想重写对任何域的请求,那么我们也可以省略该条件。
RewriteEngine ON
RewriteCond %{HTTP_HOST} ^example\.nl$ [NC]
RewriteRule ^([a-zA-Z]+)/?$ %{HTTP_HOST}/_sites/$1 [L]
注意:如果您的目录/文件夹不一定以字母开头并且可以是任何内容,则将上面的正则表达式从 ^([a-zA-Z]+)/?$
更改为 ^([.*])/?$
,
无需硬编码主机名,您可以在站点根目录 .htaccess 中尝试以下规则:
RewriteCond %{HTTP_HOST}::%{THE_REQUEST} ^(?:www\.)?([^:]+)::GET\s/+\1/_sites/(\S*)\s [NC]
RewriteRule ^ /%2 [R=301,NE,L]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^[^/]+/?$ %1/_sites%{REQUEST_URI} [L]
关于htaccess - RewriteRules 声明导致 404 错误 的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.htaccess mod-rewrite apache混淆导致每天10k 404的结果、.htaccess rewrite 规则详细说明、.htaccess Rewrite 规则详解、.htaccess RewriteRule 提供正确的链接,但也提供 404 的相关知识,请在本站寻找。