Articles of 重写

mod_rewrite,干净的URL和页面内容目录

我在我们的根目录下的.htaccess文件中使用了mod_rewrite,这样我们可以在一些特定的情况下使用更清晰的URL。 例如,我们要翻译: http://example.com/Topic/ABCD/Type/Description 成 http://example.com/Topic.php?l=ABCD&e=Type&t=Description 这似乎很容易, .htaccess文件包含: RewriteEngine on RewriteRule ^Topic/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /Topic.php?l=$1&e=$2&t=$3 [L] 但是,所有页面的内容(.CSS文件,图像等)最终都是404',因为不是从相对于重写URL的目录加载“/Common.css”: http://example.com/Common.css 它从未重写的URL的目录中加载它: http://example.com/Topic/ABCD/Type/Description/Common.css 这显然不存在。 然而,我在网上发现了无数的教程,提倡我正在做的一些变体( 这里是一个例子),但是没有提到我遇到的这个问题,所以我想知道是否只有一些configuration我俯视。 他们不能都依靠这些“虚拟”目录,并且包含页面的内容。 我也不想把一切都变成绝对path。 我曾尝试在.htaccess文件的早期添加规则来尝试短路内容请求,例如: RewriteRule \.(css|jpe?g|gif|png)$ – [L] 但似乎没有效果。 无论如何,我不会想到这样的内容甚至会匹配原来的规则,因为该规则中的正则expression式不允许跟随(可选的)尾随斜杠之后的任何内容。 如果我改变规则,使其标志被设置为redirect([R,L]而不是只是[L]),那么它一切正常 – 除了现在浏览器显示重写的PHP参数string,这就是我们试图避免。 过去,我们刚刚接受这个作为解决方法,但是现在我正试图理解为什么这样工作,以及我能做些什么。 如果是相关的,我使用CentOS 6.2和Apache / 2.2.15。

限制使用SSL只能在Apache中的一个目录

我已经安装了一个SSL证书,并运行在Apache 2.2.14上。 现在,我想限制使用https只有一个目录,即www.example.com/shop。 如果用户转到https://www.example.com或任何其他url,但www.example.com/shop,我想强制http而不是https。 我在这个网站上运行的Wordpress,并不能为我的生活弄清楚如何编写正确的重写规则(我敢打赌简单)的情况。 任何帮助感激!

url重写到不同的域

我有权访问Web服务器上的一个文件夹,我想在其中放置一个.htaccess文件,以便当用户访问www.somesite.com/myfolder/index.html时,他们会看到另一个域中的页面内容www.someothersite.com/blah/blah2/blah3/index.php?user=80338其中有一个可怕的长url,我没有访问该文件夹。 但是,我不希望用户在浏览器中看到这个URL,只是为了在幕后发生 – 我曾尝试阅读一些有关Web的教程,而我想到的是在myfolder目录中: RewriteEngine On RewriteRule ^index\.html$ http://www.someothersite.com/blah/blah2/blah3/index.php?user=80338 [QSA,L] 这似乎做了redirect,但我也得到了新的url,我怎么能阻止呢?

如何在从wordpress移植到另一个博客后创build重写

我已经将我的博客从wordpress迁移到Octopress ,并从一个域名迁移到另一个域名。 我想创build从旧网页到新网页的重写(旧的结构是http://domain.old/?p = number )。 我为此创build了服务器块,其中包含: server { listen 80; listen [::]:80; server_name .domain.old; rewrite .*p=1$ https://domain.new/2011/rebirth/ permanent; rewrite .*p=11$ https://domain.new/2011/travelling-salesman-problem/ permanent; rewrite .*p=14$ https://domain.new/2011/minecraft-classic-client-with-fly-ability/ permanent; # rewrite ^ https://domain.new permanent; } 如果我取消注释最后一个string,我得到https://domain.new/p=14 http://domain.old/p=14请求。 如果它被注释掉,我得到一些nginx的欢迎消息,但没有redirect。 我没有想法。 任何帮助赞赏。 我目前的nginxconfiguration 。

nginx:禁止访问文件夹,除了一些子文件夹

如何可以拒绝对一个文件夹的访问,但除了其中的一些子文件夹“拒绝”? 我尝试了这样的(按此顺序): #这个子文件夹不应该被拒绝,PHP脚本里面应该是可执行的 位置〜/ data / public {allow all; } #这个文件夹包含许多应该被拒绝公开访问的子文件夹 位置〜/数据{全部否认; 返回404; } …哪个不能正常工作 / data / public文件夹中的文件是可访问的(其他所有in / data被拒绝,因为它应该是这样),但PHP文件不再执行在/ data / public文件夹中(如果我不添加这些限制,PHP文件是可执行的)。 哪里不对? 怎么可能是正确的? 我认为这是一个更好的方法来做到这一点。 这将是非常好的,如果有人可以帮助我这个:)。 谢谢,但PHP文件仍然没有在/ data / public /文件夹中执行,就像一个简单的 <? echo "test"; ?> 它给你这个文件作为下载(没有上面的“拒绝”configuration,PHP文件运行良好)。 我的PHPconfiguration: location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; include fastcgi_params; } / data /之外的所有其他目录中的PHP文件正在工作…(其他子文件夹也是如此)。

使用IIS url重写redirect文件夹时出现问题

使用Url重写,我试图redirect/ foo_bar / *到/ foo / *。 我试过这个: <rule name="Redirect foo_bar to foo" stopProcessing="true"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_URL}" pattern="^/foo_bar/(.*)" /> </conditions> <action type="Redirect" url="/foo/{R:1}" /> </rule> 但是这只是redirect到/ foo / foo_bar / *。 我哪里错了?

IIS 8.5 URL重写只是不会工作:规则没有任何影响

我正在尝试使用Rewrite模块来设置http to https重写在IIS 8.5中。 绝对没有我尝试过任何影响。 该URL的格式为: http : //users-dev.somedomain.com 。 当前在web.config中创build的规则是: <rewrite> <rules> <rule name="Redirect to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" /> </rule> </rules> </rewrite> 自那以后,我尝试了许多变化。 早些时候修改URL重写,我可以看到各种规则的生效,但现在看来,我什么都没有任何影响…我怀疑是IIS的东西了。 我也试过IIS重启,无济于事… 有任何想法吗?

debuggingnginx URL重写:如何找出问题所在?

我在网站上有一个特定的url模式,需要redirect到HTTPS版本。 这是一个Django站点; Nginx会检查memcached中的每个URL,如果没有findcaching的版本,它会将请求代理到Django的Apache / mod_python来呈现页面。 相关的configuration块是 rewrite ^/certificate https://mysite.com/certificate ; rewrite ^/([a-zA-Z]{2})/certificate https://mysite.com/certificate ; …它似乎并没有工作。 Nginx是: $ nginx -V nginx version: nginx/0.7.65 built by gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu4) TLS SNI support disabled configure arguments: –prefix=/usr/local/nginx –pid-path=/var/run/nginx.pid –with-http_gzip_static_module –with-http_ssl_module 我怎样才能找出问题是我的模式不匹配,或更模糊的configuration问题? (该网站本地化为三种语言,本地化在URLstring中,例如/US/news/ , /DE/about等。它跟踪会话中的本地化,默认为美国,所以如果您刚才/news Django会重写到/US/news除非用户有一个cookie,表明他们正在使用不同的本地化.Django处理这个,但不是Nginx。)

使用apache来阻止具有特定查询string的url

我有这个url: mysite.com?var=var&var2=var2&var3=var3 我想阻止这个特定的url,但不会以任何方式影响相同的基本url上的其他查询string。 是否有可能做到这一点? 谢谢,

将apache重写转换为nginx重写

我有一个项目,我不得不将所有找不到的文件redirect到index.php。 我在apache中把.htaccess文件放在我的项目文件夹中。 该文件的内容是 – RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] 现在我想在nginx中一样。 这里是我的nginx.conf的样子 root /usr/local/apache2/htdocs; index index.php index.html index.htm; location /project/ { root /usr/local/apache2/htdocs; index index.php index.html index.htm; try_files $uri $uri/ index.php; } 现在,每当我提出一个像http://localhost/project/hello这样的请求,那么这个请求应该去http://localhost/project/index.php但是这个说File not found 。 现在为什么我认为这将工作是因为位置块内的root指令覆盖块外的root指令(尽pipe值相同),重写模块将查找/usr/local/apache2/htdocs/project/index.php 。 我在这里错过了什么? UPDATE 这个configuration工作 root /usr/local/apache2/htdocs; location /project/ { index index.php index.html index.htm; #effectively […]