Questions tagged «mod-rewrite»

Apache Web服务器的URL重写模块

5
在Apache中重定向,更改URL或将HTTP重定向到HTTPS-您曾经想知道的有关Mod_Rewrite规则的所有内容,但害怕询问
这是关于Apache的mod_rewrite 的规范问题。 使用mod_rewrite可以更改请求URL或将用户重定向到不同于他们最初请求的URL。这包括以下内容: 将HTTP更改为HTTPS(或相反) 将对不再存在的页面的请求更改为新的替换。 修改URL格式(例如?id = 3433到/ id / 3433) 根据月球和太阳下可能出现的一切,基于浏览器,引用者,不同页面显示不同的页面。 您想弄乱网址的任何内容 您曾经想了解的有关Mod_Rewrite规则的所有内容,但都不敢问! 如何成为编写mod_rewrite规则的专家? mod_rewrite规则的基本格式和结构是什么? 我需要掌握哪些形式/风格的正则表达式? 编写重写规则时最常见的错误/陷阱是什么? 什么是测试和验证mod_rewrite规则的好方法? 我应该注意mod_rewrite规则的SEO或性能影响吗? 在常见情况下,mod_rewrite看起来像是适合该工作的正确工具,但不是吗? 有哪些常见示例? 测试您的规则的地方 该htaccess的测试网站是玩弄你的规则,并测试他们的好地方。它甚至显示调试输出,因此您可以查看匹配的内容和不匹配的内容。

4
在Apache VirtualHost中重定向URL?
我有一个专用于Apache的服务器,在该服务器上设置了一些VirtualHosts。我已经设置了一个网站来处理www域名和非www域名。 我的VH .conf文件,用于www: <VirtualHost *> DocumentRoot /var/www/site ServerName www.example.com <Directory "/var/www/site"> allow from all </Directory> </VirtualHost> 与此.htaccess: RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ http://example.com/$1 [L,R=301] 有没有简单的方法可以将www重定向到非www版本?当前,我将两个版本发送到同一版本DocumentRoot并使用,.htaccess但是我确定我必须能够在VirtualHost文件中执行此操作。


3
如何为Apache Mod_proxy排除URL?
我们使用mod_proxy模块作为负载均衡器配置了两个Apache服务器作为前端,并使用4个tomcat服务器作为后端。现在,我们要从mod_proxy负载均衡器中排除单个tomcat url。有什么方法或规则可以排除吗? 代理平衡器设置: <Proxy balancer://backend-cluster1> BalancerMember http://10.0.0.1:8080 loadfactor=1 route=test1 retry=10 BalancerMember http://10.0.0.2:8080 loadfactor=1 route=test2 retry=10 </Proxy>

3
.htaccess可疑文件
此问题已从堆栈溢出迁移,因为可以在服务器故障时回答。 迁移 10年前。 这已上传到我的FTP文件夹之一。我不熟悉Apache,但仍然好奇-有人可以告诉我该文件试图提交哪种类型的卑鄙行为?谢谢! RewriteEngine On RewriteCond %{HTTP_REFERER} .*google.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*ask.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*yahoo.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*excite.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*altavista.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*msn.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*netscape.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*aol.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*hotbot.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*goto.*$ [NC,OR] RewriteCond %{HTTP_REFERER} .*infoseek.*$ [NC,OR] …

8
如何测试是否启用了mod_rewrite?
我在新安装的ubuntu 12.04上为apache2上的wordpress设置环境。 为了使友好的URL工作,我试图设置mod_rewrite。我遵循在网上找到的一些说明,并使用了a2enmod。 现在。在重新启动apache之后,我想检查模块是否实际加载。 我找到的用于获取已加载模块列表的命令是: apache2 -t -D DUMP_MODULES 但是,这将返回错误: apache2:用户名错误$ {APACHE_RUN_USER} 那么,如何实际列出所有已加载的模块,或者检查是否已启用mod_rewrite?

1
Apache mod_rewrite在重定向时对查询字符串进行双重编码
在通过查询字符串传递时,Apache mod_rewrite的行为遇到了一个奇怪的问题(也许是错误?)。 为了进行复制,我们使用默认的Apache配置设置了一个全新的Ubuntu(oneiric)安装。我们启用了mod_rewrite,并且在默认站点配置中,添加了以下内容: RewriteEngine on RewriteRule ^/(.*)$ /r/$1 [R] 为了测试,我们使用curl: curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b' 相关输出为: HTTP/1.1 302 Found Server: Apache/2.2.20 (Ubuntu) Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b 如您所见,查询字符串是两次转义的,这是错误的。有谁知道我们如何解决这个问题?我们尝试了几件事: 添加[NE]。这为我们提供了正确的查询字符串,但是路径未转义,从而导致新的问题。 添加[NE,B]。这似乎是工作,但引起/的之间a并b路径部分转义。 手动取消转义查询字符串。 RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}} 但是,这意味着我们无法区分查询字符串中的“ an” &和“转义&”。 更新: 此错误报告描述了相同的问题。第一条评论与一个显然可以解决该问题的提交有关,但是正如Pieter在下面说的那样,它似乎并没有得到真正的解决。


2
反向代理中的Apache URL重写
我将Apache部署在Karaf托管的应用程序之前(Apache和Karaf在单独的服务器上)。我希望Apache充当反向代理,并且还隐藏URL的一部分。 直接从应用服务器获取应用程序登录页面的URL是http://app-server:8181/jellyfish。页面由Karaf中运行的Jetty实例提供服务。当然,除了反向代理服务器之外,所有防火墙都通常会阻止此行为。 在关闭防火墙的情况下,如果您单击此URL,则Jetty会加载登录页面。浏览器的地址栏正确更改为http://app-server:8181/jellyfish/login?0,一切正常。 我想要的是http://web-server(即从根目录)映射到应用服务器上的Jetty,而jellyfish取消了应用的名称()。例如,浏览器将更改为显示http://web-server/login?0在地址栏中,并且所有后续URL和内容都将由Web服务器的域提供,而不会造成jellyfish混乱。 我可以使用以下配置(代码段)将Apache用作简单的反向代理:- ProxyPass /jellyfish http://app-server:8181/jellyfish ProxyPassReverse / http://app-server:8181/ ...但是这需要浏览器的URL包含在内jellyfish,转到根URL(http://web-server)会显示404 Not Found。 我花了很多时间尝试使用mod_rewrite带有和不带有它的[P]标志的方法来解决这个问题,但是没有成功。然后ProxyPassMatch,我尝试了该指令,但似乎也无法完全正确。 这是当前配置,已加载到/etc/apache2/sites-available/Web服务器上。请注意,这里有一个本地托管的图像目录。我还保留了mod_rewrite代理漏洞利用保护,并抑制了一些mod_security会带来误报的规则。 <VirtualHost *:80> ServerAdmin admin@drummer-server ServerName drummer-server ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /images/ "/var/www/images/" RewriteEngine On RewriteCond %{REQUEST_URI} !^$ RewriteCond %{REQUEST_URI} !^/ RewriteRule .* - [R=400,L] ProxyPass /images ! ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1 …

3
在HTTP OPTIONS请求中在Apache中返回“ 200 OK”
我试图在不触摸任何代码的情况下实现跨域HTTP访问控制。 我的Apache(2)服务器使用以下代码块返回了正确的访问控制标头: Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "POST, GET, OPTIONS" 现在,我需要防止浏览器发送HTTP OPTIONS请求(REQUEST_METHOD返回存储在环境变量中)时Apache执行我的代码200 OK。 当请求方法为OPTIONS时,如何配置Apache响应“ 200 OK”? 我已经尝试过此mod_rewrite块,但是访问控制标头丢失了。 RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]

4
参数长度> 255的重写URL不起作用
我正在使用mod_rewrite重写这样的URL: http://example.com/1,2,3,4/foo/ 通过在.htaccess中执行以下操作: RewriteEngine On RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA] 它可以正常工作,但当“ 1、2、3、4”变成一个长度超过255个字符的字符串时,Apache返回“ 403 Forbidden”。 foo.php?id=1,2,3,4即使使用很长的ID字符串也可以直接访问,但是这对我来说不是一个选择。 是否有一些我应该调整的Apache或其他设置? 更新:我使用RewriteLogLevel 9打开了RewriteLog。使用短ID字符串,我的日志文件中出现了几行。但是,当id字符串大于255个字符时,不会记录任何内容(似乎mod_rewrite甚至没有执行?)。 如果您觉得这个问题有趣/有帮助,请对其进行投票。

1
Apache可以有条件地从自定义http标头执行重写吗?
我在(简单的亚马逊)负载均衡器后面有一个apache服务器。我想将所有不是443的传入流量重定向到443。我希望它仅使用一个apache虚拟主机。所以我试图检测是否HTTP_X_FORWARDED_PORT标头不是443。 我已经检查了RewriteCond文档,它仅适用于一组有限的HTTP标头。 基本上我在做什么是这样的: <VirtualHost *:80> ServerName www.example.com RewriteEngine On RewriteCond %{HTTP_X_FORWARDED_PORT} !=443 RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] .... </VirtualHost> 但是RewriteCond无法识别HTTP_X_FORWARDED_PORT。 是否有其他方法(仅使用一个VirtualHost)来完成此操作?(某种类型的传入标头检查?) 谢谢,兰斯

1
url的最大长度257个字符是否可以用于mod_rewrite?
我的网址方案是/foo/var1-var2-var3.../bar 我正在使用这些mod_rewrite规则: RewriteBase /foo/ RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [PT,L] 如果字符串'var1-var2 ...'的长度大于257个字符,则返回错误403 Forbidden和404。但是,如果'var1-var2 ...'字符串的长度为257个字符或更少,并且后接斜杠,则剩余网址的长度可以为任意长度。如何克服这一限制?

3
apache2.4 mod_rewrite排除特定别名directroy / uri
我在一个虚拟主机上进行了以下设置: ...<VirtualHost *:80> ServerName cloud.domain.de ServerAdmin webmaster@domain.de ServerSignature Off Alias "/.well-known/acme-challenge" "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge" <Directory "/var/www/domain.de/vh-www/htdocs/public/.well-known/acme-challenge"> Require all granted ForceType 'text/plain' </Directory> <ifmodule mod_rewrite.c> RewriteEngine On RewriteCond %(REQUEST_URI) !/\.well\-known/acme\-challenge/?.* RewriteCond %{HTTPS} off # RewriteRule ^\.well-known/acme-challenge/([A-Za-z0-9-]+)/?$ - [L] RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </ifmodule>... 我要实现的是,http://cloud.domain.de/.well-known/acme-challenge/访问URL时,mod_rewrite不会重写URL 。 我已经尝试了不同的方法,其中一种是上面已注释掉的RewriteRule,但似乎没有任何效果:服务器每次都将其重写为https。 当出于测试目的而禁用重写时,可以很好地访问别名URL。 如何实现特定的URL不被重写?

4
使用Cookie控制Nginx代理目标?
我正在尝试使用有趣的Apache mod_rewrite设置来转换反向代理以改为使用Nginx(由于外部原因,我们正从Apache迁移到Nginx,并且除此部分外,大多数其他方法都工作正常)。 我最初的设置是读取HTTP cookie(由某些应用程序设置),然后根据其值将反向代理定向到不同的后端。它是这样的: RewriteCond %{HTTP_COOKIE} proxy-target-A RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA] RewriteCond %{HTTP_COOKIE} proxy-target-B RewriteRule ^/original-request http://backend-b/another-application [P,QSA] RewriteRule ^/original-request http://primary-backend/original-application [P,QSA] 我正在尝试使用Nginx实现相同的目的,而我的初始配置是这样的(其中“ proxy_override”是cookie的名称): location /original-request { if ($cookie_proxy_override = "proxy-target-A") { rewrite . http://backend-a/some-application; break; } if ($cookie_proxy_override = "proxy-target-B") { rewrite . http://backend-b/another-application; break; } proxy_pass http://primary-backend/original-application; } …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.