我有一个运行在我的Apache本地副本上的虚拟主机。 它有一个别名。 <VirtualHost 127.0.0.1> ServerName oliverash.me.dev DocumentRoot "/usr/docs/oliverash.me/public" Alias /mayor "/usr/docs/uni/tmosct/public" </VirtualHost> 这工作正常。 我可以访问别名,在我的浏览器中转到oliverash.me.dev/mayor 。 不过,我有一个简单的.htaccess rewrite该别名的文件夹,它将所有内容(文件夹除外)重写到index.php页面。 这个重写工作正常。 虽然重写正在工作,但重写将返回404 Not Found错误。 例如,如果我去到oliverash.me.dev/mayor/abcdefg ,重写到index.php文件,但我得到这个错误: “请求的URL /usr/docs/uni/tmosct/public/index.php在此服务器上找不到”。 这个文件确实存在。 我可以直接访问它。 当我使用相同的别名,而不是localhost主机,而不是只是这个虚拟主机,重写工作正常,和index.php返回与实际文件,而不是404。这使得我认为这是关系到权限我的虚拟主机。 所以我试图在我的httpd-vhosts.conf下添加这个(没有运气): <Directory "/usr/docs/oliverash.me/public"> AllowOverride All Order allow,deny Allow from all </Directory> 这些是在localhost的DocumentRoot上使用的相同的设置,所以我不明白为什么它没有帮助。 更新: 所以我查了一下Apache的error_log。 原来,这个别名的重写实际上是相对于这个虚拟主机的文档根。 [Fri Jan 06 22:30:57 2012] [error] [client 127.0.0.1] File does not exist: […]
我正在尝试使用mod_rewrite创build一个restful API。 我有规则: RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L] 然而,path可能包含base64编码的string(即可以有+或/),它们在PHP到达之前被解码。 例如,如果我去 /v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe PHP获取$_REQUEST['request'] as cards/9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc=Be' 。 而更糟的是,如果我在那里添加一个斜线(例如9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe – %2F是斜杠),我得到一个404。 我怎样才能防止这种情况发生? 注意:我尝试了B和NE标志,但没有任何效果。 我想作为一个黑客,我可以只将所有+字符转换为_和所有/转换,或者甚至可能是双重url编码,但我想知道是否有更好的方法。
如何创build一个只匹配没有查询string的请求的重写规则? http://www.mysite.com/index.php 应重新映射到: http://www.mysite.com/ 但 http://www.mysite.com/index.php?page=some_page 应该一个人留下。 我正在尝试这个: RewriteRule ^/index.php$ http://www.mysite.com/ [R=301,L] …但是它匹配以/index.php开始的任何内容,即使我已经明确地以一个美元符号结束了这个模式。 更新: 这之前唯一的规则是: RewriteCond %{HTTP_HOST} ^mysite.com [NC] RewriteRule ^/(.*) http://www.mysite.com/$1 [R=301,L] 目的是将非www链接redirect到www版本。
我怎样才能使用mod_rewrite删除后的一切? (问号)在一个URL? 例如:http:// 127.0.0.1/ALL_FILES.php?test=1 mod_rewrite之后:http:// 127.0.0.1/ALL_FILES.php 对于PHP来说,这意味着$ _GET超级全局将始终为空。 谢谢。
我正在为使用Apache上的JShop构build的客户pipe理电子商务网站。 对于SEO的原因链接如下所示: http://www.domain.com/shop/section/3151/1/flowers http://www.domain.com/shop/product/35465/blueflower 它被映射到: http://www.domain.com/shop/section.php/3151/1/flowers http://www.domain.com/shop/product.php/35465/blueflower 它们给出与下面相同的页面: http://www.domain.com/shop/section.php?xSec=3151&xPage=1 http://www.domain.com/shop/product.php?xSec=35465 不知何故,这是没有 mod_rewrite(我已经通过禁用mod_rewrite和注释掉所有conf和.htaccess文件中的所有重写规则)来实现。 注意:文件section.php和product.php存在,但是section和product没有,也没有符号链接。 问题是在生产服务器上这种行为停止发生。 在我的开发服务器上,它仍然有效。 我能够通过使用mod_rewrite再次正确地使生产服务器正常工作,因为这是我知道如何做到这一点的唯一方法。 但是,我真的需要知道生产服务器上发生了什么变化,所以我可以正确理解这个问题(以避免其他无法预料的后果)。 我已经重新启动了Apache,并取消了在URL被破坏时我在生产服务器上所做的所有更改。 他们仍然是坏的(没有我的新的重写规则)。 除了 mod_rewrite之外,还可以使用哪些方法从URL中删除.php扩展名?
以下exception不起作用。 http://www.domain.com有和没有/testingredirect到http://www.example.de/foo/ ,但例外不应该! RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC] RewriteCond %{REQUEST_URI} !^/test$ RewriteRule ^(.*)$ http://www.example.de/foo/ [R=302,L] 什么原因?
我们运行一个基于Zend框架的站点,使用Apache httpd(2.2)和mod_rewrite进行SEO和可用性友好的URL:s。 最近我们添加了mod_proxy (和mod_proxy_balancer, mod_proxy_http, mod_rpaf )来设置负载均衡器虚拟主机。 我们的设置现在看起来像: external.site.com (vhost on server1.site.com with reverse proxy) |-internal1.site.com (vhost on server1.site.com) |-internal2.site.com (vhost on server2.site.com) 其中internal1和internal2服务大部分dynamic内容, external服务静态内容加上一些pipe理员types页面。 所有的虚拟主机都有相同的代码和.htaccess设置。 问题是,在external.site.com RewriteRule不会正确的头添加到请求环境,特别是我们和ZendFramework依赖的REDIRECT_URL 。 一切工作正常转发给内部虚拟主机的请求。 httpd.conf的相关部分: <VirtualHost *:80> ServerName external.site.com DocumentRoot /opt/www/htdocs/ CustomLog "/var/log/httpd-proxy-access.log" combined <Proxy balancer://backend/> Balancermember http://internal1.site.com Balancermember http://internal2.site.com ProxySet lbmethod=byrequests </Proxy> ProxyRequests Off <Proxy *> Order deny,allow […]
我尝试使用fqdn的第一部分作为重写目标: http://demo.dev.example.com/something= > http://demo.dev.example.com/demo/something RewriteCond %{HTTP_HOST} ^([a-z0-9-]+).dev.example.com [NC] RewriteRule ^/(.*) http://%1.dev.example.com/%1/$1 [P] 这创造了一个无限循环。 所以我需要另一个条件来检查这个请求是否已被重写: RewriteCond %{REQUEST_URI} !^/%1 那么这是行不通的,文档没有提到在CondPatterns中使用反向引用,大多数情况下不支持。 RewriteCond %{REQUEST_URI} !^/demo 这完美的作品,但不是dynamic的。
我想通过.htaccess专门pipe理子域名。 我能够捕获我设置的子域名,例如support.testsite.com – 目前,我将其redirect到testsite.com/support。 我想要做的就是保留子域,即使在redirect之后 – 所以support.testsite.com似乎留在用户的地址栏,即使它实际上位于testsite.com/support。 我应该在/支持另一个.htaccess文件重写地址? 谢谢!
我需要创build一个重写规则,将我的网页从http://example.comredirect到https://example.com 。 但是在客户端用任何GET参数打开页面的情况下,它应该保持不变,而不需要任何redirect。 例如: http://example.com/index.php应该redirect到https://example.com/index.php http://example.com/index.php?param1=val1不应该redirect。