使用目录创建用户友好 URL

Creating user friendly URL with directory

提问人:user2896120 提问时间:6/29/2016 最后编辑:RavinderSingh13user2896120 更新时间:11/17/2023 访问量:384

问:

我有一个页面,用户在其中注册,他们被重定向到他们的个人资料。他们的个人资料 URL 是:example.com/profiles/?username=sam,其中 sam 可以是任何名称。这工作成功,但我正在努力使 URL 更干净。我想使 URL 看起来像这样: example.com/profiles/sam 这是我的.htaccess:

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteCond %{THE_REQUEST} /profiles/?\?username=([^&\s]+) [NC]
RewriteRule ^ /profiles/%1? [L,R]
RewriteRule ^(?:profiles/)?([0-9]+)/?$ /profiles/?username=$1 [L]

    SetOutputFilter DEFLATE
    <IfModule mod_setenvif.c>
        # Netscape 4.x has some problems...
        BrowserMatch ^Mozilla/4 gzip-only-text/html

        # Netscape 4.06-4.08 have some more problems
        BrowserMatch ^Mozilla/4\.0[678] no-gzip

        # MSIE masquerades as Netscape, but it is fine
        # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

        # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
        # the above regex won't work. You can use the following
        # workaround to get the desired effect:
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

        # Don't compress images
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    </IfModule>
    <IfModule mod_headers.c>
        # Make sure proxies don't deliver the wrong content
        Header append Vary User-Agent env=!dont-vary
    </IfModule>
</IfModule>

example.com/profiles/ 中的配置文件是一个目录。配置文件内部是一个索引 .php 文件,这是创建动态页面的 PHP 文件。我的.htaccess文件位于根文件夹中。我也在使用 GoDaddy。GoDaddy 声明:“由于启用mod_rewrite是在全局级别处理的,因此您不需要在 httpd.conf 文件中启用它。您只需要将所需的代码添加到 .htaccess 文件的正文中。包含重写规则的 .htaccess 文件必须与目标文件位于同一目录中。

使用我的 .htaccess,它将 URL 从 example.com/profiles/?username=sam 更改为 example.com/profiles/sam,但配置文件根本不显示,而是显示 404 错误页面,这意味着该页面不存在。该页面应存在。此外,添加选项 + 多视图会产生相同的 404 错误。此外,使用选项 + 多视图,某些页面显示 CSS 而不是 PHP 页面。

我怎样才能使 example.com/profiles/?username=sam 重定向到 example.com/profiles/sam 并使个人资料页面实际显示?

apache .htaccess mod-rewrite friendly-url

评论

0赞 Marc B 6/29/2016
[R]表示客户端重定向,这意味着您正在重写客户端,然后将客户端重定向到新 URL。你的服务器上没有“物理”/profiles/johndoe.php“页面,所以你最终会产生一个404。客户端在浏览器中看到的 URL 应始终是友好的 URL,然后您的重写会将这些友好/公共 URL 转换为“丑陋”的内部 URL。你重写是朝着另一个方向发展。
0赞 user2896120 6/29/2016
@MarcB 这很有道理,但是我该如何做到这一点呢?我如何向客户端显示用户友好的 URL,但在内部我将友好的 URL 转换为丑陋的 URL?
0赞 Marc B 6/30/2016
你总是像 一样发送 html,然后你的重写将其转换为内部 .该重写纯粹是内部的,并且仅内部/丑陋的 URL 对客户端永远不会可见。<a href="/profiles/johndoe.php">/foo/bar/profile.php?johndoe.php

答:

2赞 anubhava 6/29/2016 #1

在以下位置制定这样的规则:/profile/.htaccess

RewriteEngine On 
RewriteBase /profiles/

RewriteCond %{THE_REQUEST} /\?username=([^&\s]+) [NC] 
RewriteRule ^ %1? [L,R=302] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/?$ index.php?username=$1 [L,QSA] 
  • 您的规则仅在 之后匹配,而 之后将不匹配。[0-9]+/profile/sam
  • 要添加,您应该先检查它的存在。.php

评论

0赞 user2896120 6/29/2016
嗯,这仍然显示 404 页面而不是配置文件。它认为 example.com/profiles/sam 是一个实际的文件,但它实际上是来自 example.com/profiles/?username=sam 的动态链接
0赞 user2896120 6/29/2016
当我这样做时 example.com/profiles/index/sam 它抛出 500 内部服务器错误
0赞 user2896120 6/29/2016
example.com/profiles/ 中的配置文件是一个目录,我的网站中唯一具有 .htaccess 的部分是根文件夹。我想既然.htaccess在根目录中,那么它将在全球范围内影响该网站
0赞 user2896120 6/29/2016
@MarcB提供了一个有趣的评论,请在我的问题中查看它
0赞 user2896120 6/29/2016
此外,example.com/profiles/sam 正在工作,但它重定向到 404 错误。我怎样才能让客户端看到这个友好的 URL,但在内部它是丑陋的 URL?