【问题标题】:Mod Rewrite problemsMod重写问题
【发布时间】:2013-05-03 07:18:44
【问题描述】:

我在使用 mod 重写时遇到了一些问题。服务器是 Ubuntu 12.04、Apache2、Php 5.4。

我想要这样的网址:

www.website.com/<modelName>/<imageNumber>

www.website.com/<modelName>

实际展示:

www.website.com/showimage.php?model=<modelName>&image=<imageNumber>

www.website.com/model.php?model=<modelName>

我已将其放入 .htaccess 中:

RewriteEngine On
RewriteRule ^([^/]+)/([0-9]+)/?$   showimage.php?model=$1&image=$2  [R,L,NC,QSA]
RewriteRule ^([^/]+)/?$            model.php?model=$1               [R,L,NC,QSA]

我已经检查了 mod_rewrite 是否已加载到 apache 中。 但是页面并没有重定向。

编辑:澄清一下,结果是 404 '资源/在此服务器上不存在'和'资源//在此服务器上不存在'。

奇怪的是,我昨天还在玩它,并试图制定一个包含 website.com/model/modelName 的规则,而且现在似乎已经生效并且无法摆脱的。我尝试了十次重新启动 Apache,清除浏览器缓存,甚至安装了另一个我以前没有的浏览器,但昨天的顽固重定向即使在新浏览器 (FireFox) 中也继续进行。

我写的新重定向规则是否正确?

我如何将它们付诸实践?

我应该在 .htaccess 上设置 chmod 777 吗?

非常感谢...

编辑:这里有更多信息。

我只有一个(默认)站点,文件(包括 .htaccess)只是位于 /var/www

文件 /etc/apache2/sites-available/default 如下所示:

 <VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
            Options FollowSymLinks
            AllowOverride All
    </Directory>
    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

除了 Directory / AllowOverride All 之外,我没有更改任何内容

.htaccess 看起来像这样:

RewriteEngine On
RewriteLog "/etc/apache2/logs/rewrite.log"
RewriteLogLevel 9
RewriteBase /
RewriteRule ^([^/]+)/([0-9]+)/?$   showimage.php?model=$1&image=$2  [R,L,NC,QSA]
RewriteRule ^([^/]+)/?$            model.php?model=$1               [R,L,NC,QSA]

我已经运行 service apache2 restart 无数次了。

这个网址很好用:

/showimage.php?model=Ai&image=12

这个没有:

/Ai/12

帮助!

【问题讨论】:

    标签: mod-rewrite apache2


    【解决方案1】:
    RewriteEngine On
    RewriteRule ^([^/]+)/([0-9]+)/?$   showimage.php?model=$1&image=$2  [R,L,NC,QSA]
    RewriteRule ^([^/]+)/?$            model.php?model=$1               [R,L,NC,QSA]
    

    与其说“这应该行得通”,我将把它留给你,只翻译规则:

    • 第一条规则将匹配 [anything]/[digits] 带或不带斜杠,并使用重定向重新映射到 showimage.php?model=$1&image=$2,会破坏链(即不会执行第二条规则),不区分大小写(不需要),并保留查询字符串参数。 第二个做同样的事情,但是 model.php。

    需要注意的是,第二条规则不匹配空字符串(即获取 /)。这可能是您的问题的一部分。

    规则本身是正确的。你可以在重写工具上测试这些:http://martinmelin.se/rewrite-rule-tester/

    我相信你的问题很简单。请在评论中回答以下问题,我会从那里提出建议:

    • 您是否尝试在没有索引的情况下获取/?如果是这样,则您的任何规则都不匹配,这就是您得到 404 的原因。
    • 如果不是,您要获取的确切 URL 是什么?您有权访问服务器日志吗?如果可以,能否开启重写日志?

    【讨论】:

    • 您好,感谢您的帮助。我没有收到带有“空”网址的 404,即 www.website.com。我得到了头版,这很好。但是要求例如www.website.com/name/123 给出 404 而 www.website.com/showimage.php?model=name&image=123 工作正常。
    • 您能否在重写规则之前添加以下行:RewriteBase /。让我知道它是否有任何作用。
    • 我尝试通过将其添加到 .htaccess 中来打开重写日志: RewriteEngine On RewriteLog "/etc/apache2/logs/rewrite.log" RewriteLogLevel 9 RewriteRule ^([^/]+)/( [0-9]+)/?$ showimage.php?model=$1&image=$2 [R,L,NC,QSA] RewriteRule ^([^/]+)/?$ model.php?model=$1 [R ,L,NC,QSA] ...但是文件夹 /etc/apache2/logs 仍然是空的
    • 文件夹还是空的?好的。要么您正在运行 suhosin,要么您的 htaccess 覆盖完全关闭。转到您的虚拟主机配置并将以下索引添加到目录上的选项中:AllowOverride all。如果是那个问题,这将重新打开 htaccess。如果不是,它不会做任何事情。更多信息httpd.apache.org/docs/2.2/mod/core.html#allowoverride
    • 我在文件中添加了 RewriteBase /,但没有任何变化。请注意 /model/ 仍然有效,即使在 Chrome 中的“隐身模式”和之前从未加载过网站的机器/浏览器上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多