[英]URL rewriting in PHP without htaccess
网站在我们无法访问.htaccess
文件的网络主机上运行。 但是,我想为用户友好的 URL 进行 URL 重写。
例如原始网址
www.example.com/file?q=name
预期网址
www.example.com/file/name
正如其他人所说,只需使用/index.php/nice/looking/url
类的/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 中的所有“部分”大批)
小心包含文件,使用白名单,这样你就可以确定没有人能够加载内部文件。
正如 Alix Axel 建议您可以使用
www.example.com/index.php/file/name
那么您将使用$_SERVER['REQUEST_URI']
来处理 URL。
最好的办法是拥有这样的 URL:
www.example.com/index.php/file/name
不过,您将重写您的 PHP 代码。
如果您有一个 Apache 服务器并且启用了AcceptPathInfo ,那么您可以使用您编写的 URL。 如果/file
是常规文件,则/file/name
请求将自动重写到/file
,其PATH_INFO值为/name
。
这可以单独使用 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 home.fr.php home.de.php
然后在 apache2.conf 中:
AddLanguage fr .fr
AddLanguage de .de
AddLanguage en .en
LanguagePriority fr de en
ForceLanguagePriority Fallback
您的语言仍将进行协商,但 php 扩展名不会出现在 URL 中。
尝试这个
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]
这可以解决您的问题。 请参阅如何在.htaccess
重写 URL的帖子
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.