标签: mod-rewrite

如何使用Apache mod_rewrite隐藏.html扩展名

我有一些静态网站,我只想隐藏.html扩展名:

  • url /foo获取静态文件/foo.html
  • 浏览器仍然显示网址 /foo

然后客户端可以发送风格的书签mydomain.com/foo而不是mydomain.com/foo.html.

这听起来非常简单,mod_rewrite之前我曾经愉快地使用过(比如使用WordPress或重定向),但事实证明这更难破解.也许我错过了一些非常明显的东西,但我无法在任何地方找到解决方案而且我整天都在这里!

我们运行自己的服务器,所以这可以去哪里是最好的地方.

附录

下面检查的解决方案工作正常.然后在运行该网站一段时间后,我注意到两个问题:

  1. 所有页面都开始显得格格不入.我重新加载,清除缓存等,但仍然没有风格.我以前遇到过这个麻烦,找不到来源.

  2. 有一个目录和一个名为'gallery'的html文件,因此/ gallery链接显示了一个目录列表而不是html文件.我应该可以排序那个,但欢迎进一步提示:-)

apache mod-rewrite friendly-url url-rewriting

43
推荐指数
3
解决办法
6万
查看次数

权限被拒绝:/var/www/abc/.htaccess pcfg_openfile:无法检查htaccess文件,确保它是可读的?

大家好,我在我的网站上使用PHP,在我的系统上使用ubuntu linux.我在apache的error.log文件中得到了上述错误,即使在正确配置所有内容之后也是如此.我对此做了很多研究,但无法解决问题.有人可以帮我解决这个问题吗?以下是我的.htaccess文件abc directory.有人可以帮我这方面吗?

# -FrontPage-

IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>
AuthName abc.org
AuthUserFile /home/abc/public_html/_vti_pvt/service.pwd
AuthGroupFile /home/abc/public_html/_vti_pvt/service.grp
Options -Indexes

RewriteEngine On
RewriteRule ^alumni$ alumni.php
RewriteRule ^student$ student.php
RewriteRule ^view_alumni_article/view/([0-9]+)$ view_alumni_article.php?op=view&article_id=$1
Run Code Online (Sandbox Code Playgroud)

php apache .htaccess mod-rewrite

43
推荐指数
3
解决办法
11万
查看次数

htaccess从url中删除index.php

我有一个问题,谷歌已经使用错误的网址索引了一些网页.

他们索引的网址是:

http://www.example.com/index.php/section1/section2
Run Code Online (Sandbox Code Playgroud)

我需要它重定向到:

http://www.example.com/section1/section2
Run Code Online (Sandbox Code Playgroud)

.htaccess不是我的强项,所以任何帮助都会非常感激.

提前致谢.

apache .htaccess mod-rewrite

42
推荐指数
6
解决办法
18万
查看次数

使用mod_rewrite删除.php扩展名

我想要一个mod_rewrite规则集,所以我可以引用一个没有.php扩展名的页面,但是要重写它以包含php扩展.这将在1&1服务器上运行.

有没有好的参考资料,所以我可以自己学习更多?

apache mod-rewrite

42
推荐指数
2
解决办法
5万
查看次数

使用SSL代理

我有一台运行Apache的Linux主机和一台运行IIS的Windows主机.我有一个指向Linux主机的域,需要将其中继(代理)请求发送到IIS; 因此我在Apache中有以下虚拟主机定义(工作正常):

<VirtualHost 192.168.0.2:80>
    ServerName www.acme.com
    DocumentRoot /var/www/acme.com

    RewriteEngine On
    RewriteOptions Inherit
    RewriteRule ^/(.*) http://win.acme.com/$1 [P]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

现在我想添加SSL支持; 定义变为:

<VirtualHost 192.168.0.2:443>
    ServerName www.acme.com
    DocumentRoot /var/www/acme.com
    GnuTLSEnable On
    GnuTLSPriorities NORMAL:%COMPAT
    GnuTLSCertificateFile /var/www/ssl/www.acme.com.crt
    GnuTLSKeyFile /var/www/ssl/www.acme.com.key

    RewriteEngine On
    RewriteOptions Inherit
    RewriteRule ^/(.*) https://win.acme.com/$1 [P]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我在两个Web服务器上都有有效且可信的证书,如果我访问https://win.acme.com一切都很好,但是,当我访问时,https://www.acme.com我收到500内部服务器错误消息.查看错误日志显示:

[Wed Jul 20 08:35:34 2011] [错误] [客户端76.168.166.70] SSL代理请求www.wileybits.com:80但未启用[提示:SSLProxyEngine] [Wed Jul 20 08:35:34 2011] [error] proxy:HTTPS:无法为74.166.186.70:443启用ssl支持(win.acme.com)

请注意代理请求似乎是针对错误的域(wileybits)...它显示的域也由我的Apache服务器托管,但我不知道为什么它出现在acme.com的日志中(反向也许是DNS查找?)

无论如何,我错过了什么?

提前谢谢 - ekkis

ps主机名和地址已被修改,以保护无辜:)

*更新*

有:

RewriteRule ^/(.*) https://win.acme.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但当然,Windows的主机名变得可见,这在我的场景中是不可接受的

我也试过(而不是mod_rewrite):

ProxyRequests Off
ProxyPass / …
Run Code Online (Sandbox Code Playgroud)

mod-rewrite apache2 virtualhost mod-proxy ssl-certificate

42
推荐指数
1
解决办法
6万
查看次数

AH10411 错误:空格和 %20 导致 Apache mod_rewrite 出现 403 Forbidden

.htaccess我今天更新了 Apache(至 2.4.56-1) ,以前可以正常工作的大量重写现在出现了 AH10411 错误,与查询中的空格有关。我正在努力寻找“适当”的解决方案。

用户单击一个链接,例如<a href='FISH%20J12345.6-78919'>clickme</a>- 您可以看到链接 URL 中的空格已被编码为%20

.htaccess相关服务器目录中的文件包含并执行以下相关指令:

RewriteRule ^(FISH\s*J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

(在上面我检查的是空格,而不是%20,因为浏览器似乎在符合此规则之前将其转换为空格)。

在我更新 Apache 之前,这一直有效;现在用户收到 403 错误,我的 Apache 错误日志报告:

AH10411:重写的查询字符串包含控制字符或空格

这似乎是一个新错误,因为谷歌搜索什么也没找到!

编辑我的页面(例如)将空格更改为下划线并正确处理它并不是真正的选择,因为该设计旨在支持用户能够直接使用他们关心的对象的名称输入 URL。到目前为止,我发现的唯一解决方法有点难看,即在正则表达式中分别捕获源名称的两个部分,因此:

RewriteRule ^(FISH)\s*(J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1+$2 [L,QSA]
                  ^   ^                                               ^^^
Run Code Online (Sandbox Code Playgroud)

(我$1%20$2最后尝试了一下,也导致了同样的错误。)

对此有更好的解决方案吗?即,当 URL 位于我想要捕获并作为参数传递给底层页面的字符串中时,我“应该”如何处理 URL 中的空格情况?

apache .htaccess mod-rewrite url-rewriting

42
推荐指数
2
解决办法
1万
查看次数

mod_rewrite规则重定向除一个特定路径之外的所有请求

我正在尝试使用Apache 2.2 VirtualHost声明中的mod_rewrite将所有请求重定向到我的域到另一个域.有一个例外 - 我希望/audio路径中的所有请求都不会被重定向.

我写了一个RewriteCond和RewriteRule来做到这一点,但它不太正确,我无法弄清楚为什么.正则表达式包含字符串"/ audio"的负前瞻,但由于某种原因,这不匹配.这是定义:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
Run Code Online (Sandbox Code Playgroud)

如果我将RewriteCond更改为:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC]
Run Code Online (Sandbox Code Playgroud)

(即将正斜杠放在负前瞻部分之外)然后它可以正常工作,但这样做的缺点是不会重定向到没有尾部斜杠的mydomain.net请求.

谁能指出我做错了什么?

(注意:上面的RewriteRule位中的域周围的尖括号是由StackOverflow.com添加的 - 它们在实际代码中不存在!)


以下是规则:

<VirtualHost *:80>
ServerAdmin me@mydomain.net
DocumentRoot "/var/www/mydomain.net/htdocs"
ServerName www.mydomain.net
ServerAlias mydomain.net

RewriteEngine on
RewriteCond {REQUEST_URI} !^/audio
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
RewriteLog logs/mod_rewrite_log
RewriteLogLevel 3

ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

谢谢@mercutio - 这很有道理,但它似乎仍然不起作用.

当我向http://mydomain.net/audio/something.mp3发出请求时,这是mod_rewrite日志所说的内容:

(2) init rewrite engine with requested uri /audio/something.mp3
(3) applying pattern '^(.*)$' to …
Run Code Online (Sandbox Code Playgroud)

apache mod-rewrite

40
推荐指数
1
解决办法
5万
查看次数

htaccess 301 redirect - 删除查询字符串(QSA)

我一直在努力解决一些htaccess重定向问题.我只是花了一些时间在堆栈上阅读和搜索,并且无法获得适用于我的场景的anwser.

我正在将旧客户端网站的301重定向转换为新的客户端网站.旧页面有参数查询,我想从网址中删除.

/menu.php?idCategorie=29&idDetail=172

/new-website-page/

我有多个查询要做,这里有几个例子:

/menu.php?idCategorie=29&idDetail=172
/menu.php?idCategorie=29&idDetail=182
/menu.php?idCategorie=29&idDetail=184
/menu.php?idCategorie=29&idDetail=256
Run Code Online (Sandbox Code Playgroud)

所有这些都链接到不同的新页面.

这是我试过的:

RewriteCond %{QUERY_STRING} idDetail=172
RewriteRule ^menu.php(.*) /new-page/? [R=301,L]
Run Code Online (Sandbox Code Playgroud)

我被正确重定向,但URL保留查询字符串:

http://website.com/new-page/?idCategorie=29&idDetail=172
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

RewriteRule ^menu.php?idCategorie=29&idDetail=172$ http://website.com/new-page/? [L,R=301]
Run Code Online (Sandbox Code Playgroud)

还有这个:

RewriteCond %{QUERY_STRING} idDetail=172(.*)$
RewriteRule ^menu.php /new-page-name?$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

并且它不起作用(最后仍然有查询字符串)

谢谢!

regex apache .htaccess mod-rewrite url-rewriting

40
推荐指数
2
解决办法
6万
查看次数

$ service apache2 restart [fail]

我在我的Ubuntu服务器上安装了Apache.出于特殊原因,我必须在其上启用mod_rewrite.所以我做到了这一点.

在互联网上的每个教程中,最后一个命令是重启apache.但当我这样做时,控制台打印[fail].

有人能帮我一下吗?

$ service apache2 restart 
 * Restarting web server apache2      [fail] 
Run Code Online (Sandbox Code Playgroud)

apache mod-rewrite

40
推荐指数
2
解决办法
9万
查看次数

.htaccess中的Multiviews选项究竟是什么?

我一直在努力解决一个需要重写一个URL添加路径的访问规则.

RewriteRule ^(configuration/.+)$ application-server/$1 [L,NC,R=301,NE]
Run Code Online (Sandbox Code Playgroud)

此规则仅在我的Joomla站点上导致空白页面,没有错误日志或消息.奇怪的是,我完成了所有其他规则:

RewriteRule ^(log/.+)$ application-server/$1 [L,NC,R=301,NE]
RewriteRule ^(monitor/.+)$ application-server/$1 [L,NC,R=301,NE]
Run Code Online (Sandbox Code Playgroud)

最后,我在论坛中发现了使用以下选项的建议:

Options -Multiviews
Run Code Online (Sandbox Code Playgroud)

这实际上解决了这个问题,但是我想知道在使用这个选项时是否会对其他规则产生任何副作用.

.htaccess mod-rewrite

37
推荐指数
1
解决办法
4万
查看次数