我试图为某个域build立一个全面的子域(以前的重写规则没有被捕获),并且从位于与.htaccess文件相同的文件夹中的一个子目录提供一个网站。 我已经有我的vhosts.conf发送所有未映射的请求到一个“操场”文件夹,我想通过简单地添加一个子文件夹轻松创build新的子域名。 所以,我的结构看起来像这样: /var/www/playground |-> /foo |-> /bar 生活在/ playground文件夹中的.htacces和/ foo和/ bar是分开的网站。 我希望http://foo.domain.com指向/ foo,并将http://bar.domain.com指向/ bar。 这是我的.htaccess文件: RewriteEngine On RewriteCond %{HTTP_HOST} ^([^.]+).domain.com$ [NC] RewriteCond %{REQUEST_URI} !^/%1/(.*) RewriteRule ^(.*) /%1/$1 [L] 这应该是捕获子域,将其添加为RewriteRule中的子文件夹,然后追加斜杠和path信息。 第二个RewriteCond是为了防止无限循环。 我的想法是,第二个RewriteCond中的%1将能够捕获第一个RewriteCond中的捕获组。 但到目前为止,我还没有取得任何成功,它总是以redirect循环结束。 如果我将第二个RewriteCond中的%1replace为硬编码的'foo'或'bar',它会起作用,这使我相信你不能引用RewriteCond中的捕获组。 是真的吗? 还是我错过了什么?
我在我的DMZ中运行Apache 2.2.15作为反向代理。 我在互联网上提供了一个内部networking上的应用程序供员工通过反向代理使用。 作为这个应用程序的一部分,员工可以看到带有PDF附件的消息。 内部员工(不必通过反向代理)可以下载这些PDF文件。 外部人员不能。 这就是我在应用程序服务器上的Apache日志中看到的内容。 172.20.0.9 – – [04/Dec/2014:08:48:21 +1300] "GET /application/home/getAttachment/MTE7Y3lzdGljIGZpYnJvc2lzLnBkZg%3D%3D HTTP/1.1" 200 88090 10.0.0.2 – – [04/Dec/2014:08:48:27 +1300] "GET /application/home/getAttachment/MTE7Y3lzdGljIGZpYnJvc2lzLnBkZg== HTTP/1.0" 400 – 第一个请求来自成功下载PDF文件的内部用户。 第二个来自DMZ中的反向代理。 请注意,它是如何将URL末尾的“%3D%3D”转义为“==”的。 我正在做的反向代理中有几件事情。 首先如果有人试图去根目录,一个重写规则将它们发送到应用程序目录。 <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/$ /application/ [NE,R] </IfModule> configuration的其他相关部分是反向代理部分。 <IfModule mod_proxy.c> RequestHeader set Front-End-Https "On" SSLProxyEngine on SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive […]
我正在使用SSI在一个网站上工作,在HTML页面上设置一个variables,然后在mod_rewrite重写之后,该variables将被脚本拾取。 这工作在我的本地设置,但由于某种原因,它不在生产服务器(都是Apache 2.2.22)。 这里是相关的位: perl脚本: my $working = ($ENV{'HTTP_my_var'} || $ENV{'REDIRECT_HTTP_my_var'}) || "NO"; print "Content-type: text/html\n\n"; print "is it working? <b>$working</b>"; .htaccess相关行 RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.*)$ /$1.html [L] RewriteRule ^my_tst$ /cgi-bin/my_tst.cgi [L] HTML文件: <!–#set var="HTTP_my_var" value="YES" –> <!–#include virtual="/cgi-bin/my_tst.cgi" –> <br> <!–#include virtual="/my_tst" –> 这是我的本地机器上的结果: 它在工作吗? 是 它在工作吗? 是 但是在生产服务器上: 它在工作吗? […]
Apache的文档说,你可以使用mod_rewrite做类似的事情mod_proxy,通过使用[P]选项。 我应该用哪个? 还是没有区别? 现在我使用的是从mod_proxy中的ProxyPass ,因为我也想包含ProxyPassReverse ,而且文档暗示你应该有这个,并且从mod_rewrite文档中不清楚ProxyPassReverse (或者等价的function)是否包含在RewriteRule .. [P] 你用哪个?
Q1。 是否有可能进一步优化 / 压缩以下规则,从而使整个redirect更快 ,更容易维护? 有大约二十这些领域! 你得到我的问题的照片! 非常感谢任何和所有的线索+1 RewriteCond %{REQUEST_URI} ^/$ RewriteCond %{HTTP_HOST} ^website.com$ RewriteRule ^$ en/home [R=301] RewriteCond %{HTTP_HOST} ^website.de$ RewriteRule ^$ de/home [R=301] RewriteCond %{HTTP_HOST} ^website.fr$ RewriteRule ^$ fr/home [R=301] 等等等等 Q2。 我应该把这些规则放在一起,比如把[C]放在最后? Q3。 这是从search引擎的angular度redirect的正确方式?
有人为我在Apache服务器上设置一个目录,我将把我的PHP应用程序。 该目录有一个192.168.1.5/app的外部path,并指向/home/test/app 。 我的应用程序通过像/img/logo.png这样的URL来引用它的文件,而不是../img/logo.png或类似的东西。 我遇到的问题是这些URL现在指向192.168.1.5/img/logo.png而不是192.168.1.5/app/img/logo.png 。 在IIS中,为了解决这个问题,我会将应用程序目录声明为一个应用程序,它将根URL设置为该目录 。 我如何在Apache中做类似的事情 (完全使用这个方法或其他的东西)?
我有一个Apache服务器在不同的端口使用两个SSL域(没有SNI支持),有点像这样: https://host1.tld:443 (默认) https://host2.tld:444 (非标准) 我有一个重写规则redirecthttp://host2.tld:80到:444(和主机1相同)。 然后是这个问题: 我有一个文件夹“文件夹”host2根。 如果我尝试访问http://host2.tld/folder/ ,一切正常,我最终在https://host2.tld:444 /文件夹/按预期。 现在,如果我inputhttp://host2.tld/folder,apache会将我redirect到http://host2.tld:444 / folder / ,这不存在。 由于从“文件夹”redirect到“文件夹/”是自动完成,我能做些什么来解决我的问题? Mod-rewriteconfiguration: <VirtualHost *:80> ServerName host2.tld RewriteEngine On RewriteRule (.*) https://%{HTTP_HOST}:444%{REQUEST_URI} [R=301,L] </VirtualHost>
我在Apache 2.4.25上有一个虚拟主机,通过mod_proxy_fcgi连接PHP-FPM 7.1.4,如下所示: <VirtualHost *:80> ServerName example.com DocumentRoot /srv/www/example.com <Directory /srv/www/example.com> AllowOverride All Require all granted </Directory> SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 <FilesMatch ".+\.ph(p[3457]?|t|tml)$"> SetHandler "proxy:unix:/run/php/example.sock|fcgi://localhost" </FilesMatch> </VirtualHost> 大多数应用程序在这个设置上都能正常工作,但是有一个应用程序使用PATH_INFO来提取请求。 该应用程序在它的.htaccess中有这样的东西: RewriteEngine On RewriteCond $1 ^index\.php RewriteRule ^(.*)$ – [PT,L] RewriteRule ^(.*)$ index.php/$1 [PT,L] 简而言之,所有不是index.php东西都应该作为一个path传递给它。 访问URL http://example.com/index.php/test工程并按预期显示[PATH_INFO] => /test ,但访问http://example.com/test与 AH01071: Got error 'Primary script unknown\n' 为mod_rewrite和mod_proxy_fcgi设置LogLevel […]
我在httpd 2.2.15上使用mod_jk和mod_rewrite。 我有一个规则…. RewriteCond %{REQUEST_URI} !^/video/play\.xhtml.* RewriteRule ^/video/(.*) /video/play.xhtml?vid=$1 [PT] 我只是想重写像/ video / videoidhere这样的/video/play.xhtml?vid=videoidhere这在我的开发机器上完美的工作,但在生产中,我得到了一个404(由Jboss生成,而不是Apache)。 这里是prod(broken)上access.log和rewrite.log的尾部。 dev(工作)上的rewrite.log完全一样, applying pattern '^/video/(.*)' to uri '/video/46279d4daf5440b2844ec831413dcc3b' RewriteCond: input='/video/46279d4daf5440b2844ec831413dcc3b' pattern='!^/video/play\.xhtml.*' => matched rewrite '/video/46279d4daf5440b2844ec831413dcc3b' -> '/video/play.xhtml?vid=46279d4daf5440b2844ec831413dcc3b' split uri=/video/play.xhtml?vid=46279d4daf5440b2844ec831413dcc3b -> uri=/video/play.xhtml, args=vid=46279d4daf5440b2844ec831413dcc3b forcing '/video/play.xhtml' to get passed through to next API URI-to-filename handler "GET /video/46279d4daf5440b2844ec831413dcc3b HTTP/1.1" 404 420 "-" "Mozilla/5.0 (X11; […]
根据这个答案: mod_rewrite的最大URL长度为257个字符? 基于使用mod_rewrite的文件系统,最多有255个字符的硬限制。 根据接受的答案,有两个解决scheme: 将每个斜杠之间的应用程序的URL格式更改为最多255个字符。 将重写规则移入apache虚拟主机configuration并删除REQUEST_FILENAME。 我不能使用第一种方法,所以我想弄清楚第二种方法。 我已经按照要求将重写规则放入Apache虚拟主机configuration中。 不过,我不知道如何删除REQUEST_FILENAME,仍然有我的Web应用程序框架(蜻蜓)仍然工作。 以下是我从.htaccess移动到Apache的虚拟主机configuration文件中的部分重写规则: RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-f [OR] # if don't want Dragonfly to process html files comment # out the line below (you may need to remove the [OR] above too). RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ # Main URL rewriting. RewriteRule (.*) index.cgi?$1 [L,QSA] […]