我们最近inheritance了一些代码,并且正在审查其中一个站点的.htaccess文件。 我知道大部分重写规则集的最终结果是什么,我只是不确定一些语法。 背景信息:使用Apache 2.4的CentOS 7,运行Concrete5 CMS。 例1: RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 据我所知,%{HTTPS}是mod_rewrite提供的特殊variables之一,可以on或off 。 在之前的规则中,我看到了RewriteCond %{HTTPS} =on这更符合文档中显示的内容。 所以在上面的例子中,我有以下问题: %{HTTPS}中的结尾“s”是什么? 为什么模式使用^ on而不是= on。 这有效吗? 我明白,括号中的任何内容都可以用%1来引用,但这里的放置对我来说并不合适。 如果%{HTTPS}计算为on或off ,则放置(s)| 在模式是要使它不符合条件,对不对? PIPE是什么? 例2: #redirect calls to index.php without get parameters to non-www RewriteCond %{REQUEST_METHOD} !=POST RewriteCond %{THE_REQUEST} /index\.php\s [NC] RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE] 我不太理解第二个RewriteCond。 index.php最后做了什么? 例3: 最后,我们有 […]
这个问题我一直没有得到一个权威的答案,但它对我感兴趣多年: 把Apache与重写规则匹配,说: 1组匹配触发403禁止情况。 403页面在网站上托pipe,所以基本上这些条件会触发网站上的另一个页面加载,并且基本上向探测者确认基本域或IP存在。 但是我一直想知道的是,如果有一种方式基本上发送匹配某些条件的请求,比如已知的垃圾邮件/入侵尝试模式,并且基本上将其发送到/ dev / null或apache等价物。 从来没有find这样的解决scheme,我经常只是使用一个虚假的域名,并redirect匹配的请求到这个虚假的域名,从我的服务器中删除负载,因为该域名不存在(我总是select抽象的名称实际上并不存在),301之后的请求获得404,但在我的理想情况下,请求只会失败并返回任何东西,或一些Apache的等价物。 这实际上是我需要弄清楚的,因为某些工具正在被用于检测一些关于我们网站的数据,而这些数据是不应该被检测到的,但是这里的原因并不重要,因为每个网站的变化情况,我的问题是,我猜,有几点: 如果不存在基本redirect到/ dev / null这样的事情,是否有办法dynamic地分配服务器上不存在的F禁止403页面,这样请求就不会退回到站点403页面,这可能会让一些事情暴露给人们探测。 这是最糟糕的select,因为该网站正在确认IP地址/域和端口存在。 理想情况下,有没有办法实际发送请求无处? 在一个完美的世界里,它会返回404,因为没有find我猜测这意味着特定的IP地址探测器会导致不存在。 也许这毕竟是某种意义上的答案? 但它不会是一个404,然后加载的网站404页面,这将是一个404像一个不存在的生成一个请求,或一个IP地址,不存在的端口组合探头。 当然,最好的情况是,当请求匹配模式时,它什么都不做,不响应,什么也不做,请求被吸收到黑洞中。 就好像你从一些实际根本不存在的东西中所要求的东西。 不是来自确实存在的域,而是不存在的页面,而是整个请求与任何域或页面或IP地址不匹配的地方。 在这个Apache mod重写的特定场景中find任何信息是非常困难的,至less我从来没有发现过这个问题,所以如果任何人都可以提供一个权威的答案,我已经构build了问题标题,可能导致search结束在本页。 同样,理想的结果是,在重写规则中满足匹配条件之后,探测器从未意识到它实际上在IP端口扫描上获得了活动站点,这意味着,不是403,而是301,而不是200响应,而不是来自网站的HTMLtypes的响应。 请注意,在这种情况下,我无法访问主数据中心防火墙或服务器防火墙,因此它必须是我可以使用Apache 2本身获得的最佳结果。
我想要实现的是以下几点:我想有许多子域名,如abc.domain.comredirect到一个url,如www.domain.com/something?subdomain=abc 由于我正在redirect到完全限定的域,所以我需要使用反向代理来避免浏览器中URL的更改。 (使用[P]标志并打开mod_proxy模块和一些其他模块) 这是我的DNS设置 *.domain.com. 14400 A 111.111.11.1 这是我的虚拟主机configuration为Apache <VirtualHost 111.111.11.1:80> ServerName www.domain.com ServerAlias *.lionite.com DocumentRoot /var/www/html ErrorLog /var/www/logs UseCanonicalName off RewriteEngine on RewriteCond %{REQUEST_URI} !^/images RewriteCond %{HTTP_HOST} !^www\.domain\.com$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^([^.]+)\.domain\.com(.*) http://www.domain.com/something?subdomain=$1 [P,L] 这个设置工作正常(让我知道,如果你认为你可以改善它当然)。 我的主要问题是当我试图设置https:// 这是我的虚拟主机configuration为Apache <VirtualHost 111.111.11.1:443> ServerName www.domain.com:443 ServerAlias *.domain.com DocumentRoot /var/www/html SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW […]
是 RewriteRule ^foo$ /bar/ [L,R,NC] 相同 RewriteRule ^foo$ /bar/ [R,NC,L] ? 我会认为最后的| L规则将会是最后的?
我觉得我有一个独特的情况,谷歌没有告诉我很多。 我想有一个方法来在HTML中有一个超链接,只需要去:http://:8081 http://:8080 当页面本身在端口80上运行时。 这通常很容易,但是这是作为一个虚拟设备在我们的销售团队机器上离线运行而开发的,因此IP地址将始终因运行的机器而不同。 我也不能使用DNS。 Afaik,不可能有一个相对的超链接来链接到另一个端口。 然后我想我可能只是链接到“./site1”和“./site2”,然后使用mod_rewrite将这些链接写到正确的端口。 有谁知道如何做到这一点? 当我意识到我想将URL重写为一个静态IP,我不能这样做的时候,我去做了,并被卡住了! (apache或者nginx重写规则,或者任何其他解决scheme非常受欢迎!)
我有麻烦redirect(通过.htaccess)这样的url: www.url.com/index.php?option=com_content&task=view&id=60&Itemid=22 至 www2.url.com/something.htm 我发现问题是“旧”的URL。 一个“正常的”redirect(www.url.com/test.htm – > www2.url.com/something.htm)的效果很好。 我也尝试过重写,但找不到可行的解决scheme。 也许有人有想法如何解决我的问题? 非常感谢Lars。 仅供参考:服务器:Apache和我有完全的根访问服务器 编辑使用的重写规则: 我在.htaccess中使用重写规则尝试了以下内容 testing1: RewriteCond %{QUERY_STRING} option=com_content&task=view&id=63&Itemid=11 RewriteRule $ www2.url.com [R=301,L] 结果1:redirect到www2 url,但不仅限于www2.url.com。 它redirect到www2.url.com/option=com_content&task=view&id=63&Itemid=11 testing2: RewriteRule ^option=com_content&task=view&id=63&Itemid=11$ www2.url.com [R=301,L] 结果2:什么都没发生。 感谢您的提示:-)
我需要将包含一个或多个string(包括%字符)(例如%123)的string重写为另一个包含%字符(例如%234)的string。 我可以用这样的特殊的THE_REQUEST属性来做到这一点: RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /(.*)\%123(.*)\ HTTP RewriteRule .* /%1\%234%2 [R,NE] 但是,对于包含多个“%123”string的URL,这不起作用… N选项没有效果,因为看起来THE_REQUEST的值没有改变。 有任何想法吗?
我需要在example.com/mydir/中放置一个.htaccess,将/mydir/(.*)中的所有url重写(不redirect)到/mydir/index.php?var=$1。 如果一个URL是一个存在的path或文件,它是不相关的(我必须重写)。 我不能使用+ FollowSymLinks,但SymLinksIfOwnerMatch。 谢谢。
我有这个文件夹结构: /var/www/mysite/abc/ /var/www/mysite/def/ /var/www/mysite/fgh/ /var/www/mysite/ijk/ /var/www/mysite/portal/ /var/www/mysite/wyz/ 今天我的服务器将www.mydomain.com所有请求redirect到www.mydomain.com/portal ,这没关系… 但是我想修改这个行为,并保持www.mydomain.com在后台访问/var/www/mysite/portal/文件夹,而www.mydomain.com/abc/仍然访问/var/www/mysite/abc/文件夹像之前一样。 这就是我在我的htaccess上没有成功的尝试: IndexIgnore * Options +FollowSymlinks <IfModule mod_rewrite.c> RewriteEngine On #This doesn't work!!! #RewriteCond %{REQUEST_URI} !^abc #Neither this :\ #RewriteCond %{REQUEST_URI} !^/abc RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^$ /portal/index.php [L] RewriteRule . /portal/index.php [L] </IfModule> 当我使用这个.htaccess(有或没有注释行)时,所有请求都会继续到www.mydomain.com/portal/
我使用了几个重写指令,总是工作之前在Apache2,但现在我试图新的共享主机和重写规则似乎并没有得到应用。 我已经将.htaccess文件减less到以下基本规则: RewriteEngine On Rewritebase /demo/ RewriteRule ^(.*)$ index.php/$1 [L] 正如你所看到的,我想重写每个请求到我的index.php文件从根目录演示文件夹。 所以像http://www.example.com/demo/albums/show/1这样的东西应该由http://www.example.com/demo/index.php来处理,用于标准的MVC设置。 (我使用CodeIgniter btw) 上面的指令导致500错误,所以我想也许是因为1.3和2.x之间的一些可能的语法差异。 经过一些跟踪和错误编辑,我发现重写规则本身是错,但我真的不明白为什么。 任何想法,为什么我的重写规则不起作用? 它曾经在很多不同的服务器上做过。 build议如何解决它? 注意 :mod_rewrite工作,我写了一个小testing是肯定的