【问题标题】:URL rewriting in PHP without htaccess在没有 htaccess 的 PHP 中重写 URL
【发布时间】:2021-09-23 18:16:48
【问题描述】:

网站在我们无权访问.htaccess 文件的网络主机上运行。但是,我想为用户友好的 URL 进行 URL 重写。

例如原始网址

www.example.com/file?q=name

预期网址

www.example.com/file/name

【问题讨论】:

  • 以网站的文章部分为例。用户提交文章并生成动态网址,如 www.domain-name/articles?cat=3&id=34 但我想要这样的 www.domain-姓名/文章/猫名/文章名

标签: php web-hosting


【解决方案1】:

正如其他人所说,只需使用 /index.php/nice/looking/url 之类的链接。
URL中间的“index.php”可能看起来有点奇怪,但我认为没有.htaccess也不可能让它看起来更好

否则,您可以要求您的托管商将任何 URL 重定向到 /index.php,这样您就可以处理 URL 重写,而无需在 URL 中添加 /index.php

然后您可以只使用正则表达式匹配来检测要包含的文件。
preg_match('@[/]{1}([a-zA-Z0-9]+)@', $_SERVER["PATH_INFO"], $matches) ($matches 将包含数组中 url 的所有“部分”)

小心包含文件,使用白名单,确保没有人能够加载内部文件。

【讨论】:

    【解决方案2】:

    正如 Alix Axel 建议的那样,您可以使用

    www.example.com/index.php/file/name
    

    然后您将使用$_SERVER['REQUEST_URI'] 来处理 URL。

    【讨论】:

    • 在这种情况下最好使用$_SERVER['PATH_INFO'] 而不是$_SERVER['REQUEST_URI']
    • 这个解决方法看起来不错。当我使用 www.domain-name.com/index.php/filename 时出现一个问题,它看起来像当前目录更改并且所有 css 格式丢失并且相对导航也不起作用。任何建议。
    • 为您的每个文件引用添加/基础引用,例如<a href="/support.html"> </a>,也可以使用基础引用src="/media/css.css"链接您的CSS
    【解决方案3】:

    最好的办法是使用如下 URL:

    www.example.com/index.php/file/name
    

    您将重写您的 PHP 代码。

    【讨论】:

      【解决方案4】:

      如果您有 Apache 服务器并且启用了AcceptPathInfo,那么您可以使用您编写的 URL。如果/file 是常规文件,则/file/name 的请求将自动重写为/filePATH_INFO 值为/name

      【讨论】:

        【解决方案5】:

        这可以单独使用 Apache 配置(httpd.conf 或 apache2.conf)中的语言/内容协商以及重写规则。不需要使用.htaccess 文件。

        在 apache2.conf 文件(或 httpd.conf)中添加 Multiviews 指令、MultiviewsMatch 指令和重写规则

        <Directory /var/www/html>
            Options Indexes FollowSymLinks Multiviews
            AllowOverride None
            Require all granted
        
            RewriteEngine On
            RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
            RewriteRule ^ /%1 [NC,L,R]
        
            <Files "*.php">
                MultiviewsMatch Any
            </Files>
        </Directory>
        

        然后保存文件并重启Apache sudo systemctl restart apache2

        如果稍后在 httpd.conf 中指定 Options 指令,则必须为每个站点重复 Multiviews 指令:

        <Directory /var/www/html/chocolate.com/>
          Options FollowSymLinks Multiviews
          AllowOverride All
          Require all granted
        </Directory>
        
        <Directory /var/www/html/vanilla.com/>
          Options FollowSymLinks Multiviews
          AllowOverride All
          Require all granted
        </Directory>
        

        如果您已经以多种语言提供服务,这不会对内容协商产生不利影响。例如,将 example.com/home.php 替换为

        home.en.php 主页.fr.php 主页.de.php

        然后在apache2.conf中:

        AddLanguage fr .fr
        AddLanguage de .de
        AddLanguage en .en
        LanguagePriority fr de en
        ForceLanguagePriority Fallback
        

        仍会协商您的语言,但 php 扩展名不会出现在 URL 中。

        【讨论】:

          【解决方案6】:

          或者可以在index.php文件中创建路由开关:

          $request = $_SERVER['REQUEST_URI'];
          
          switch ($request) {
              case '/file' :
                  require __DIR__ . '/file';
                  break;
              case '' :
                  require __DIR__ . '/file';
                  break;
              case '/file/name' :
                  require __DIR__ . '/file?q=name';
                  break;
              default:
                  http_response_code(404);
                  require __DIR__ . '/404.php';
                  break;
          }
          

          【讨论】:

            【解决方案7】:

            试试这个

            www.example.com/file?q=name

            www.example.com/name(优于www.example.com/file/name

            从您的项目根文件夹中打开您的.htaccess 并添加此代码

            Options +FollowSymLinks
            
            RewriteEngine On
            RewriteRule \.(js|css|jpe?g|png|gif)$ - [L]
            
            
            RewriteRule "^([ \w-]+)/?$" /file?q=$1 [L,QSA]
            

            这解决了您的问题。查看帖子如何rewrite URL in .htaccess

            【讨论】:

            • OP 特别声明“没有 htaccess”。它甚至在问题的标题中。
            猜你喜欢
            • 1970-01-01
            • 2015-05-14
            • 1970-01-01
            • 1970-01-01
            • 2013-11-30
            • 2018-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多