如何允许路由声明在 Apache2 中的单独文件中加载视图?

如何允许路由声明在 Apache2 中的单独文件中加载视图?

我的网站使用自己的 PHP 框架,可以为页面提供良好的 URL:

About Us  =>  https://www.myurl.com/about
Contacts  =>  https://www.myurl.com/contacts

它在 Vagrant 本地设置中运行良好,但是一旦我将我的网站上传到 Apache2,访问这些网站就会引发:

此服务器上未找到所请求的 URL /about

该服务器上未找到所请求的 URL /contacts。

可能是因为它的优先级是在“关于”和“联系人”文件夹中搜索文件,而不是监听/index.php定义路线并加载关于或联系页面的视图的文件。

主页中的视图https://www.myurl.com运行正常,问题发生在 URI 声明的页面之后https://www.myurl.com/.....

这是我的 .conf 文件

ServerAdmin [email protected]
ServerName myurl.com
ServerAlias www.myurl.com
DocumentRoot /var/www/myurl.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.myurl.com [OR]
RewriteCond %{SERVER_NAME} =myurl.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI}      [END,NE,R=permanent]

答案1

在我的 .htaccess 文件中添加以下几行之后,路由终于可以正常工作了:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

以前当我要去的时候,它会在目录https://www.myurl.com/about内搜索 index.php 文件。/var/www/myurl.com/public_html/about/

使用 .htaccess 中的新代码,当我转到https://www.myurl.com/about.htaccess 文件时,首先优先搜索index.php文件中定义的视图,如果没有加载任何视图,它会搜索具有给定名称的目录。

答案2

我不知道为什么上述配置在 Vagrant 上有效,但在原生 Apache 上无效。我的经验告诉我,当 Apache 的配置不够严格时,它有时有效,有时无效。特别是当您从一个 Apache 版本迁移到另一个版本时。我还多次读到,如果可能的话,最好避免使用重写规则。

因此我更愿意使用单独的配置文件来设置我的虚拟主机,它看起来应该像这样:

ServerName myurl.com # Remove this line if there is another ServerName directive at the global level, or change it to 'ServerName localhost' if you want.

<VirtualHost *:80>  
        ServerName myurl.com
        ServerAlias www.myurl.com
        ServerAdmin [email protected]
        ErrorLog ${APACHE_LOG_DIR}/myurl.com.error.log
        CustomLog ${APACHE_LOG_DIR}/myurl.com.access.log combined   

        # Redirect Requests to HTTPS
        Redirect permanent "/" "https://myurl.com/"
</VirtualHost>

<IfModule mod_ssl.c>    
<VirtualHost _default_:443>
        ServerName myurl.com
        ServerAlias www.myurl.com
        ServerAdmin [email protected]
        ErrorLog ${APACHE_LOG_DIR}/myurl.com.error.log
        CustomLog ${APACHE_LOG_DIR}/myurl.com.access.log combined   

        DocumentRoot /var/www/myurl.com/public_html
        <Directory /var/www/myurl.com/public_html>
               Options None FollowSymLinks
               AllowOverride None 
               # Use 'AllowOverride All' to enable all .htaccess overrides
               DirectoryIndex index.html index.php
               Order allow,deny
               Allow from all
               Require all granted
        </Directory>

        SSLEngine on
        SSLCertificateFile /path/to/your/cert.file
        SSLCertificateKeyFile /path/to/your/privkey.file
        SSLCertificateChainFile /path/to/your/chain.file
</VirtualHost>
</IfModule>

创建新的配置文件:/etc/apache2/sites-available/myurl.com.conf。您应该在其中粘贴并修改上述行。

禁用当前配置文件。可能您应该使用a2dissite。然后启用新配置文件:sudo a2ensite myurl.com.conf。并重新启动 Apache。我认为现在应该可以正常工作了。

此外,在上述配置中,boothhttp://myurl.comhttp://www.myurl.com会将所有请求重定向到https://myurl.com。但是,该地址https://www.myurl.com在请求时将可访问。如果您想要重定向如下:

  • http://myurl.comhttps://myurl.com

  • http://www.myurl.comhttps://www.myurl.com

ServerAlias您应该从定义中删除该指令<VirtualHost *:80>并创建另一个指令:

<VirtualHost *:80>  
        ServerName myurl.com
        ...
        Redirect permanent "/" "https://myurl.com/"
</VirtualHost>

<VirtualHost *:80>  
        ServerName www.myurl.com
        ...
        Redirect permanent "/" "https://www.myurl.com/"
</VirtualHost>

...

相关内容